我正在尝试创建一个连接到远程服务器并执行更新的脚本,但我想确保当时没有人在使用该计算机,因此我执行“ps”命令来查看进程,然后提示如果安装应该继续。这是我试图制作的代码:
ssh -T root@$machine <<- 'END'
#Show the non-root processes
ps -ef | grep -v root
#Prompt if should continue (this doesn't work)
echo "Continuar a instalação? [y/n]"
select valor in y n
do
case $REPLY in
y )
echo "Digitado y"
break
;;
n )
echo "Digitado n"
exit
;;
esac
done
#Test if it's working
echo "Test"
END
当我执行此代码时,我得到以下行为:
Continuar a instalação? [y/n]
1) y
2) n
#? 1) y
2) n
#? #? 1) y
2) n
#? #?
#? 1) y
2) n
#? #? #? 1) y
2) n
#? #? #? #?
然后脚本关闭。我尝试使用 -t -t 选项运行 ssh 但仍然遇到同样的问题。我缺少什么?
答案1
select
当您将脚本放在 上时,您无法与远程进程 ( ) 通信stdin
。当你的输入结束时,你会遇到这样的情况:select
从你的文件中读取一些垃圾stdin
,然后读取 EOF。
您应该使用将文件复制到服务器scp
,然后运行它。
答案2
我决定将命令分成两个 ssh 连接,一个用于列出进程,另一个用于更新,在它们中间提示继续:
ssh -T root@$machine <<- 'END1'
ps -ef | grep -v root | grep -v lightdm
END1
echo "Continuar a instalação? [y/n]"
select valor in y n
do
case $REPLY in
y )
break
;;
n )
exit
;;
esac
done
ssh -T root@$machine <<- 'END2'
printf "Test\n"
END2
问题是它会要求你输入 ssh 连接的密码两次。