2010-11-03 108 views
2

我有本地腳本,我想在遠程服務器上運行。我已經設置了ssh密鑰對來啓用無密碼登錄。我可以在遠程服務器上運行位於本地計算機上的bash腳本嗎?

我目前的做法是rsync的腳本到服務器,然後運行它:

ssh [email protected] "rsync localserver:script.sh ./; ./script.sh; rm script.sh" 

然而,這似乎是一個黑客;有沒有一種更加用戶友好的方式來做到這一點?

更新:由於有這麼多好的答案,任何人都可以幫助我通過提供基本原理來選擇'最好'的答案嗎?

回答

9

SSH將命令從stdin

ssh -T [email protected] <script.sh 

編輯-T Disable pseudo-tty allocation

+0

不錯!正是我想要的,只是它返回「僞終端不會被分配,因爲標準輸入不是終端。」;你知道爲什麼或者我該如何擺脫這個? – 2010-11-03 17:43:57

+0

也許我過了一會兒就複雜一點... – Flexo 2010-11-03 17:44:24

+0

@大衛 - 見編輯。 – eduffy 2010-11-03 17:48:06

1

是使用管道:

Test.sh:

#!/bin/bash 

echo "test" 

管打壞上遠程機:

[email protected]:/tmp > cat test.sh | ssh [email protected] "cat | bash" 
test 
+1

不必要的使用貓。 – Sorpigal 2010-11-03 17:46:20

+0

@Sorpigal,你什麼意思是不必要的? – 2010-11-03 17:47:03

+3

「cat | bash」可以用「bash - 」替換,「cat test.sh」可以用<如Sorpigal的回答來實現。 – Flexo 2010-11-03 17:48:33

3

總有辦法。

ssh [email protected] 'sh -' < script.sh 
+0

很好。這需要處理不使用'sh-'返回的錯誤消息......你知道爲什麼嗎? – 2010-11-03 17:48:10

+0

我不能完全信任地告訴你究竟有什麼不同。 – Sorpigal 2010-11-03 17:53:28

1

由@Sorpigal答案的另一個版本

ssh [email protected] 'bash -s' < script.sh 
+0

''bash-''也可以工作,雖然 - 似乎它是專門爲此設計的。 – Sorpigal 2010-11-03 17:55:40

+0

爲什麼投了票? – 2012-06-04 13:58:08

0
ssh -T [email protected] < script.sh 
# "Pseudo-terminal will not be allocated because stdin is not a terminal." 

你混淆sshd服務器,因爲它假定是:標準輸入是一個終端的交互式登錄會話 - sshd將分配一個僞tty用於這樣的會話 - 如果命令被指定爲您的ssh(客戶端)命令的參數,而代之以sshd會看到其默認shell的stdin被重新指定從輸入重定向運算符<指定的文件導向。

它的「在遠程主機上執行的角度上看,當ssh客戶端不提供一個命令,但sshd的標準輸入重定向」從sshd種意外行爲的默認外殼從文件或在此文件/串或管道。

ssh localhost <<<'echo Hello, world!' 
ssh localhost sh <<<'echo Hello, world!' 
ssh -T localhost <<<'echo Hello, world!' 
相關問題