Bash
通過 ssh 執行時防止期望掛起
根據另一篇文章的回答,我設法通過 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 eof
orset 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 eof
用interact
工作代替更好。它不會掛起,設置正確的密碼,甚至正確啟動它。