2010-11-03 88 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!' 
相关问题