shell - script - ssh with password




如何使用SSH在遠程機器上運行shell腳本? (7)

假設你的意思是你想從一台“本地”機器自動完成此操作,而不需要手動登錄到“遠程”機器,你應該查看一個名為Expect的TCL擴展,它的設計正是為了這種情況。 這是主頁下面看起來有點蹩腳,但不要讓你勸阻你; 我還提供了通過SSH登錄/交互的腳本鏈接。

http://expect.nist.gov/

http://bash.cyberciti.biz/security/expect-ssh-login-script/

我必須在遠程機器上運行一個shell腳本(windows / Linux)。

我在機器A和B上都配置了SSH。我的腳本在機器A上,它將在遠程機器B上運行我的一些代碼。

本地和遠程計算機可以是基於Windows或Unix的系統。

有沒有辦法使用plink / ssh來執行此操作?



如果機器A是一個Windows機器,則可以使用Plink( PuTTY一部分)和-m參數,它將在遠程服務器上執行本地腳本。

plink [email protected] -m local_script.sh

如果機器A是基於Unix的系統,則可以使用:

ssh [email protected] 'bash -s' < local_script.sh

您不應該將腳本複製到遠程服務器才能運行它。


我已經開始使用Fabric進行更複雜的操作。 Fabric需要Python和其他一些依賴項,但只能在客戶機上運行。 服務器只需要一個ssh服務器。 我發現這個工具比傳遞給SSH的shell腳本功能強大得多,而且值得設置的麻煩(特別是如果你喜歡用Python編程的話)。 Fabric在多個主機(或某些特定角色的主機)上處理運行腳本,有助於促進冪等操作(例如向配置腳本添加一行,但如果它已經存在),並允許構建更複雜的邏輯(如Python語言可以提供)。


這是一個古老的問題,傑森的答案正常,但我想補充一點:

ssh [email protected] <<'ENDSSH'
#commands to run on remote host
ENDSSH

這也可以用於需要用戶輸入的su和命令。 (注意'逃脫的heredoc)

編輯:由於這個答案不斷獲得流量,我會添加更多信息heredoc的這個奇妙的用途:

你可以用這個語法嵌套命令,這就是嵌套的唯一方法似乎可行(以一種理智的方式)

ssh [email protected] <<'ENDSSH'
#commands to run on remote host
ssh [email protected] <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH

實際上你可以與telnet,f​​tp等一些服務進行對話。但請記住,heredoc只是將stdin作為文本發送,並不等待線路之間的響應

編輯:我剛剛發現,如果您使用<<-END !您可以縮進內部!

ssh [email protected] <<-'ENDSSH'
    #commands to run on remote host
    ssh [email protected] <<-'END2'
        # Another bunch of commands on another host
        wall <<-'ENDWALL'
            Error: Out of cheese
        ENDWALL
        ftp ftp.secureftp-test.com <<-'ENDFTP'
            test
            test
            ls
        ENDFTP
    END2
ENDSSH

(我認為這應該工作)

另見http://tldp.org/LDP/abs/html/here-docs.html


這裡的答案( https://.com/a/2732991/4752883 )很好用,如果你想使用plinkssh在遠程Linux機器上運行腳本。 如果腳本在linux上有多行,它將工作。

**但是,如果您嘗試運行位於本地linux/windows計算機上的批處理腳本,並且您的遠程計算機是Windows ,並且它由多行使用**

plink [email protected] -m local_script.bat

不會工作。

只有腳本的第一行會被執行。 這可能是plink的限制。

解決方案1:

運行多行批處理腳本(特別是如果它相對簡單,由幾行組成):

如果您的原始批處理腳本如下所示

cd C:\Users\ipython_user\Desktop 
python filename.py

您可以使用“&&”分隔符將這些行組合在一起,如下所示在local_script.bat文件中: https://.com/a/8055390/4752883 : local_script.bat

cd C:\Users\ipython_user\Desktop && python filename.py

在此更改之後,您可以運行腳本,如@ JasonR.Coombs所示: https://.com/a/2732991/4752883 ://.com/a/2732991/4752883:

`plink [email protected] -m local_script.bat`

解決方案2:

如果你的批處理腳本比較複雜,最好使用封裝plink命令的批處理腳本,以及@Martin在這裡指出的https://.com/a/32196999/4752883 :

rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N

rem Wait a second to let Plink establish the tunnel 
timeout /t 1

rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R

rem Kill the tunnel
taskkill /im plink.exe

<hostA_shell_prompt>$ ssh [email protected] "ls -la"

這將提示您輸入密碼,除非您已將您的hostA用戶的公鑰複製到用戶.ssh目錄的home_assigned_keys文件中。 這將允許進行無密碼身份驗證(如果在ssh服務器的配置中作為身份驗證方法接受)







remote-execution