防止通过 ssh 运行时expect挂起

防止通过 ssh 运行时expect挂起

基于另一个邮政的答案,我设法通过 ssh 实现expect自动化vncserver(在这种情况下可以选择在 chroot 上),如下所示:

ssh user@ip "rm ~/.vnc/passwd"
echo -n "`PASS_VNC`" | ssh user@ip "cat > PASS_VNC.file"
ssh user@ip << 'EOF'
export TERM=xterm
chroot /targetdir
PWD="$( cat PASS_VNC.file )"
/usr/bin/expect <<EOD
set timeout -1
spawn screen bash
send -- "/usr/bin/vncserver -geometry 1366x768 :1\r"
expect "Password:"
send -- "$PWD\r"
expect "Verify:"
send -- "$PWD\r"
expect "Would you like to enter a view-only password"
send -- "n\r"
expect eof
EOD
EOF

工作,都用于设置密码(由另一个名为 的函数生成PASS_VNC,我将其保存在远程计算机上的文件中)+vncserver成功启动...问题是,它悬挂(当期望脚本完成时),我总是不得不使用Ctrl+C 手动

我尝试了我能想到的一切,无论是exit在expect脚本中使用,close(expect的一部分),,sleepsend -- \x03用于发送Ctrl+ C)等。

我不确定如何防止悬挂。在这个特定的情况下我该如何做到这一点?我猜测挂起可能来自expect eofset timeout -1,但如果删除这些,那么脚本将无法正常工作,至少在我自己的测试中是这样。

与 ssh 一起使用-t并没有多大帮助(如果有的话)(相同的结果)。

PS:我宁愿不发送脚本,并且更喜欢这种与heredoc一起scp使用的方法(如果可能的话)。ssh

答案1

尝试了一些东西后,发现一些可行的东西:

ssh user@ip "rm ~/.vnc/passwd"
echo -n "`PASS_VNC`" | ssh user@ip "cat > PASS_VNC.file"
ssh user@ip << 'EOF'
export TERM=xterm
chroot /targetdir
PWD="$( cat PASS_VNC.file )"
/usr/bin/expect <<EOD
set timeout -1
spawn screen bash
send -- "/usr/bin/vncserver -geometry 1366x768 :1\r"
expect "Password:"
send -- "$PWD\r"
expect "Verify:"
send -- "$PWD\r"
expect "Would you like to enter a view-only password"
send -- "n\r"
interact
EOD
EOF

看来换成expect eof工作interact更好。它不会挂起,设置正确的密码,甚至正确启动它。

相关内容