
我正在嘗試建立一個 Windows 批次文件,該文件透過連接埠轉送啟動 putty/plink,僅此而已。 Windows部分目前已經準備就緒:
start plink.exe -ssh -i key.ppk -L 1234:localhost:80 [email protected]
由於我不想允許在身份驗證後執行其他命令,因此我使用ForceCommand
聲明Match User
:
Match User sampleUser
ForceCommand echo 'Success! Close this window to log out.'
問題是,運行我的批次檔可以正確啟動 putty,但它在執行回顯我指定的文字後立即關閉。
我的想法是使用這樣的東西:
ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC
這樣,putty/SSH 應該保持連線處於活動狀態並且不會退出我的連接埠轉送。
我想過像yes
,ping
或 之類的命令read
,但是它們
- 正在向我的終端機視窗發送垃圾郵件
- 實際上正在做一些事情/產生不必要的 CPU 負載
- 如果有人按 Enter 鍵,可能會意外關閉
是否有一個命令永遠不會執行任何操作,直到有人使用 Ctrl+C 終止它或透過關閉 putty 視窗來關閉 SSH 連線?
我該用來做什麼waitTillControlC
?
答案1
我不明白為什麼所有其他回應都想在這裡使用循環,睡眠能夠等待足夠長的時間以達到任何實際目的,並且不會使用任何時鐘週期來執行此操作。
例如,它會嘗試在這裡休眠一百年,並且可能會盡力滿足請求:
echo "Something"; sleep 36500d
或者,這也應該阻止,直到您鍵入Enter密鑰:
echo "Something"; read foo
答案2
答案3
這應該永遠休眠,而不消耗任何(明顯的)CPU 功率。
echo "Something" && while true; do sleep 9999; done
我也不確定你是否可以發出像ForceCommand
子句中的命令。您可能需要將命令放入 shell 腳本中。
#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done
當然,該腳本應該位於某個位置並且具有權限,以便伺服器上的普通用戶無法對其進行寫入。
Match User sampleUser
ForceCommand /usr/bin/waitforever
編輯
我發現了一個看起來更優雅的指令:
echo "Something" && tail -f /dev/null
tail -f
等待檔案或流返回位元組。 (否則對於即時查看日誌很有用。)/dev/null
永遠不會返回位元組。因此該命令將永遠休眠。
答案4
你試圖從錯誤的方向解決這個問題。您不希望 shell 不退出,您希望 putty 讓視窗保持開啟。
http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit- 準確描述您需要更改的內容。如果您想使用「僅在乾淨退出時」選項,只需exit 1
在 ForceCommand 末尾新增即可。
編輯:我誤解了;您只想維護轉送的端口,不想保留 ForceCommand 的輸出。在這種情況下,不http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell做你想做的事?