在 bash 和 zsh on macos 中交互或取消等待输入的命令
interact or cancel a command that is waiting for input in bash and zsh on macos
我需要一种方法来取消正在等待输入的命令或向其发送输入以使其越过等待输入阶段这是场景
我有一个脚本,其中我是 运行 一个名为 aws-login 的 python 脚本,它将消失并尝试使用现有凭据登录 aws,如果凭据有效的话如果凭据不再有效,它会提示输入密码,我想终止进程或发送新行,这样它就会失败并移至脚本的下一部分
我知道我在几年前以我想要的方式运行它,然后我的笔记本电脑和一些咖啡发生了事故,然后我才能够备份脚本
目前我的方法是这样
function kill_proc() {
local line=''
while IFS= read -r line; do
#echo ' \n' > /proc/${line}/fd/0
kill -9 "$line"
done < /dev/fd/0
}
function aws_process_login() {
local line=''
while IFS= read -r line; do
if echo "$line" | grep -Fq "ERROR: Cannot extract saml assertion"; then
ps aux | grep -i aws-adfs | grep -Fv 'grep -i' | tr '\t' ' ' | tr -s ' ' | cut -d' ' -f2 | kill_proc
echo "${line}" >> /tmp/_$$_aws_error.txt
echo -ne '\r3[0KPassword test for User: '
break
else
echo "${line}" >> /tmp/_$$_aws_login.txt
echo "test2"
fi
sleep 0.050
done < '/dev/stdin'
}
PYTHONUNBUFFERED="TRUE" PATH=$_PATH aws-adfs login --adfs-host=$ADFS_DOMAIN --adfs-ca-bundle=$ROOT_CA --profile="" --session-duration 3600 --s3-signature-version s3v4 2>/dev/fd/1 | aws_process_login
主要问题是 aws_process_login 结束时会导致程序暂停
zsh: suspended (tty input) PYTHONUNBUFFERED="TRUE" PATH=$_PATH aws-adfs login --adfs-ca-bundle=$ROOT_CA
所以脚本就卡在那里了有人有什么想法吗?我需要它在 zsh 和 bash 中工作,因为该脚本的一些用户使用 bash 但大多数用户使用 zsh
我找到了一个解决方案,不幸的是它只适用于这种非常特殊的情况,因此不能与其他程序一起使用。
echo "${username}\n${password}" | PYTHONUNBUFFERED="TRUE" PATH=$_PATH aws-adfs login --adfs-host=$ADFS_DOMAIN --adfs-ca-bundle=$ROOT_CA --profile="" --session-duration 3600 --s3-signature-version s3v4 --stdin >/tmp/_$$_aws_login.txt 2>/tmp/_$$_aws_error.txt
显然,如果您使用 --stdin 选项向 aws-adfs 提供空白密码,它将跳过密码提示(我确信我已经测试过这个但显然我没有)
这符合我的要求,我想要一个自定义密码提示,所以在第一次通过时它会跳过询问密码并尝试登录,如果它成功,我的脚本就会结束,如果它失败,那么我的脚本就会循环回来并在随后的时间要求输入密码并通过密码变量将其传递。
我需要一种方法来取消正在等待输入的命令或向其发送输入以使其越过等待输入阶段这是场景
我有一个脚本,其中我是 运行 一个名为 aws-login 的 python 脚本,它将消失并尝试使用现有凭据登录 aws,如果凭据有效的话如果凭据不再有效,它会提示输入密码,我想终止进程或发送新行,这样它就会失败并移至脚本的下一部分
我知道我在几年前以我想要的方式运行它,然后我的笔记本电脑和一些咖啡发生了事故,然后我才能够备份脚本
目前我的方法是这样
function kill_proc() {
local line=''
while IFS= read -r line; do
#echo ' \n' > /proc/${line}/fd/0
kill -9 "$line"
done < /dev/fd/0
}
function aws_process_login() {
local line=''
while IFS= read -r line; do
if echo "$line" | grep -Fq "ERROR: Cannot extract saml assertion"; then
ps aux | grep -i aws-adfs | grep -Fv 'grep -i' | tr '\t' ' ' | tr -s ' ' | cut -d' ' -f2 | kill_proc
echo "${line}" >> /tmp/_$$_aws_error.txt
echo -ne '\r3[0KPassword test for User: '
break
else
echo "${line}" >> /tmp/_$$_aws_login.txt
echo "test2"
fi
sleep 0.050
done < '/dev/stdin'
}
PYTHONUNBUFFERED="TRUE" PATH=$_PATH aws-adfs login --adfs-host=$ADFS_DOMAIN --adfs-ca-bundle=$ROOT_CA --profile="" --session-duration 3600 --s3-signature-version s3v4 2>/dev/fd/1 | aws_process_login
主要问题是 aws_process_login 结束时会导致程序暂停
zsh: suspended (tty input) PYTHONUNBUFFERED="TRUE" PATH=$_PATH aws-adfs login --adfs-ca-bundle=$ROOT_CA
所以脚本就卡在那里了有人有什么想法吗?我需要它在 zsh 和 bash 中工作,因为该脚本的一些用户使用 bash 但大多数用户使用 zsh
我找到了一个解决方案,不幸的是它只适用于这种非常特殊的情况,因此不能与其他程序一起使用。
echo "${username}\n${password}" | PYTHONUNBUFFERED="TRUE" PATH=$_PATH aws-adfs login --adfs-host=$ADFS_DOMAIN --adfs-ca-bundle=$ROOT_CA --profile="" --session-duration 3600 --s3-signature-version s3v4 --stdin >/tmp/_$$_aws_login.txt 2>/tmp/_$$_aws_error.txt
显然,如果您使用 --stdin 选项向 aws-adfs 提供空白密码,它将跳过密码提示(我确信我已经测试过这个但显然我没有)
这符合我的要求,我想要一个自定义密码提示,所以在第一次通过时它会跳过询问密码并尝试登录,如果它成功,我的脚本就会结束,如果它失败,那么我的脚本就会循环回来并在随后的时间要求输入密码并通过密码变量将其传递。