Gnu-Screen
SSH 進入伺服器,啟動螢幕會話,更改目錄?
我想通過 SSH 連接到伺服器,啟動螢幕會話,
cd
進入path/to/my/script/
並在test.sh
那裡執行。作為初學者,我嘗試過
ssh me@myserver.com screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
並希望在 中看到,但我在那裡看到了我的主目錄
path/to/my/script/
。output.txt
這意味著該cd
命令實際上不起作用,因此 bash 將無法執行test.sh
.我該如何解決這個問題?
簡短的回答:在命令周圍添加一些額外的引號,如下所示:
ssh me@myserver.com "screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'"
要查看發生了什麼,您可以指定
-v
選項ssh
以獲取一些調試資訊。在這種情況下,您將看到如下所示的原始命令行debug1: Sending command: screen -dm bash -c cd path/to/my/script/; pwd > ~/output.txt
而額外的引號將其更改為
debug1: Sending command: screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
所以看起來 ssh 只是接受傳遞給它的參數,將它們全部連接起來,然後讓遠端端再次將連接的參數列表拆分為單獨的參數。呼叫參數列表
argv
(如在 C 中),您在原始版本中得到如下內容:argv[0] = ssh argv[1] = me@myserver.com argv[2] = screen argv[3] = -dm argv[4] = bash argv[5] = -c argv[6] = cd path/to/my/script/; pwd > ~/output.txt
現在原則上,可以將to作為單獨的參數
ssh
傳遞給另一方,在這種情況下,它可能會按預期工作。但是正如調試行顯示的那樣(根據原始碼也看起來像這樣),這些參數被連接到字元串argv[2]``argv[6]
screen -dm bash -c cd path/to/my/script/; pwd > ~/output.txt
然後在遠端端對其進行解釋。從這裡也很清楚為什麼它不做你想做的事:現在你正在按順序執行兩件事,首先
screen -dm bash -c cd path/to/my/script/
(因此screen
啟動一個僅更改目錄的會話)從主目錄執行,然後thenpwd > ~/output.txt
也從主目錄執行。為了完整起見,帶有雙引號的命令的參數是
argv[0] = ssh argv[1] = me@myserver.com argv[2] = screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
導致
screen -dm bash -c 'cd path/to/my/script/; pwd > ~/output.txt'
被發送到另一端(如調試行所示),這確實按預期工作。