我可以运行位于远程服务器上本地计算机上的bash脚本吗?

时间:2010-11-03 17:37:28

标签: bash shell ssh

我有本地脚本,我想在远程服务器上运行。我已经设置了ssh密钥对来启用没有密码的登录。

我目前的方法是将脚本rsync到服务器然后运行它:

ssh user@remoteserver "rsync localserver:script.sh ./; ./script.sh; rm script.sh"

然而,这似乎是一个黑客;是否有更友好的用户方式?

更新:由于有很多好的答案,有人可以通过提供理由帮助我选择“最佳”吗?

5 个答案:

答案 0 :(得分:10)

SSH将从stdin

获取命令
ssh -T user@server <script.sh

修改-T Disable pseudo-tty allocation

答案 1 :(得分:3)

总有办法。

ssh user@host 'sh -' < script.sh

答案 2 :(得分:1)

是的,使用烟斗:

Test.sh:

#!/bin/bash

echo "test"

管道在远程机器上进行bash:

ajw@xxxxxxx:/tmp > cat test.sh | ssh ajw@xxxxxxxx.xxx.xx "cat | bash"
test

答案 3 :(得分:1)

@Sorpigal的另一个答案

ssh user@host 'bash -s' < script.sh

答案 4 :(得分:0)

ssh -T user@server < script.sh
# "Pseudo-terminal will not be allocated because stdin is not a terminal."

你混淆了sshd服务器,因为它假设一个交互式登录会话,stdin是一个终端 - sshd会为这样的会话分配一个伪tty - 如果没有 command被指定为ssh(客户端)命令的参数,但是sshd看到其默认shell的stdin被重定向到输入重定向运算符<指定的文件。

sshd客户端未提供要在远程主机上执行的命令但重定向ssh的stdin时,从sshd的角度来看,这是一种意外的行为来自文件或此处文档/字符串或管道的默认shell。

ssh localhost <<<'echo Hello, world!'
ssh localhost sh <<<'echo Hello, world!'
ssh -T localhost <<<'echo Hello, world!'