基于另一个邮政的答案,我设法通过 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的一部分),,sleep
(send -- \x03
用于发送Ctrl
+ C
)等。
我不确定如何防止悬挂。在这个特定的情况下我该如何做到这一点?我猜测挂起可能来自expect eof
或set 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
更好。它不会挂起,设置正确的密码,甚至正确启动它。