Gnu-Screen

SSH 進入伺服器,啟動螢幕會話,更改目錄?

  • January 2, 2017

我想通過 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'被發送到另一端(如調試行所示),這確實按預期工作。

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