Bash

通過 ssh 執行時防止期望掛起

  • March 25, 2021

根據另一篇文章的回答,我設法通過 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在期望腳本中使用,close(期望的一部分)sleep,,send -- \x03(用於發送Ctrl+ C)等。

我不確定如何防止掛起。在這種特定情況下我怎麼能做到這一點?我猜測掛起可能來自expect eofor set timeout -1,但如果將它們刪除,那麼腳本將無法正常工作,至少在我自己的測試中是這樣。

與 ssh 一起使用-t並沒有多大幫助(同樣的結果)。

PS:我更喜歡不發送腳本,如果可能的話,我更scp喜歡這種ssh與heredoc一起使用的方法。

在嘗試了一些東西之後,發現了一些有用的東西:

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 eofinteract工作代替更好。它不會掛起,設置正確的密碼,甚至正確啟動它。

引用自:https://unix.stackexchange.com/questions/640935