如果机器A是一个Windows电脑,则您可以使用Plink(PuTTY的一部分)和-m参数,在远程服务器上执行本地脚本。
plink root@MachineB -m local_script.sh
如果 Machine A 是基于 Unix 系统的,你可以使用:
ssh root@MachineB 'bash -s' < local_script.sh
您不需要将脚本复制到远程服务器上才能运行它。
sudo
权限的脚本,请运行以下命令:ssh root@MachineB 'echo "rootpass" | sudo -Sv && bash -s' < local_script.sh
。 - bradley.ayersssh root@MachineB ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
完全感谢@chubbsondubs下面的答案。 - Yves Van Broekhoven-s
选项的真正目的是能够向通过标准输入流被调用的脚本传递参数:ssh root@MachineB 'bash -s arg1 arg2' < local_script.sh
。省略-s
将导致arg1
被解释为远程执行的脚本,而arg2
则作为其第一个参数。不需要使用环境变量。 - JoL这是一个旧问题,Jason的回答很好,但我想要补充:
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
这也可以与su和需要用户输入的命令一起使用。(请注意带转义符号'
的heredoc)
由于此答案不断获得访问量,我想为这种heredoc的精彩用法添加更多信息:
您可以使用此语法嵌套命令,这似乎是嵌套以合理方式工作的唯一方法。
ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.example.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
你实际上可以与一些服务(如telnet、ftp等)进行交互。但请记住,heredoc只是将stdin作为文本发送,它不会在行之间等待响应。
我刚刚发现如果您使用<<-END
,您可以使用制表符缩进内部内容!
ssh user@host <<-'ENDSSH'
#commands to run on remote host
ssh user@host2 <<-'END2'
# Another bunch of commands on another host
wall <<-'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.example.com <<-'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
(我认为这应该可以工作)
<<'ENDSSH'
)周围加上单引号,字符串将不会被展开,变量也不会被评估。如果要进行展开,您还可以使用<<ENDSSH
或<<"ENDSSH"
。 - maackleExpect
可用于自动化交互式命令,比如 FTP。 - programaths另外,如果您想从目标主机接收变量,请不要忘记转义它们。
这在过去曾让我出了岔子。
例如:
user@host> ssh user2@host2 "echo \$HOME"
打印出 /home/user2
同时
user@host> ssh user2@host2 "echo $HOME"
打印出 /home/user
另一个例子:user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"
正确打印出 "hello"。
ssh user2@host 'bash -s' echo $HOME /home/user2 exit
- curious_prismssh
会话中的for
循环中,循环变量不应该被转义。 - AlexeyDaryinssh user2@host2 'echo hello world' | awk '{ print $1 }'
即在本地运行 Awk 脚本。如果远程命令产生大量输出,您肯定希望避免将所有内容都复制回本地服务器。顺便说一句,单引号包含远程命令可以避免任何转义的需要。 - tripleeessh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
# commands to run on remote host
echo $ARG1 $ARG2
ENDSSH
我发现这个方法非常有用,因为将所有内容都保存在一个脚本中,使得它易于阅读和维护。
这个方法的原理是:ssh支持以下语法:
ssh user@host remote_command
在bash中,我们可以在单行命令中指定要定义的环境变量,如下所示:
ENV_VAR_1='value1' ENV_VAR_2='value2' bash -c 'echo $ENV_VAR_1 $ENV_VAR_2'
这样就可以很容易地在运行命令之前定义变量。在这种情况下,echo是我们要运行的命令。在echo之前的所有内容都定义了环境变量。
因此,我们将这两个特性与YarekT的答案结合起来,得到:
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'...
在这种情况下,我们将ARG1和ARG2设置为本地值。将user@host之后的所有内容作为remote_command发送。当远程机器执行该命令时,由于本地命令行评估,ARG1和ARG2将被设置为本地值,并且通过定义环境变量在远程服务器上执行bash -s命令。完成。
ssh user@host "ARG1=\"$ARG1\" ARG2=\"$ARG2\"" 'bash -s' <<'ENDSSH'...
- TalkLittlessh user@host 'bash -s value1 value2' <<< 'echo "$@"'
- JoL<hostA_shell_prompt>$ ssh user@hostB "ls -la"
如果您没有将hostA用户的公钥复制到用户.ssh目录下的authorized_keys文件中,那么这将提示您输入密码。如果在ssh服务器的配置中接受作为身份验证方法,则可以实现免密码身份验证。
我开始使用Fabric进行更复杂的操作。 Fabric只在客户端需要Python和其他一些依赖项,而服务器只需要是ssh服务器即可。 我发现这个工具比传递给SSH的shell脚本要强大得多,并且非常值得安装(特别是如果您喜欢用Python编程)。Fabric处理在多个主机(或特定角色的主机)上运行脚本,帮助促进幂等操作(例如将一行添加到配置脚本中,但如果已经存在则不添加),并允许构建更复杂的逻辑(就像Python语言可以提供的那样)。
cat ./script.sh | ssh <user>@<host>
chmod +x script.sh
ssh -i key-file root@111.222.3.444 < ./script.sh
尝试运行命令 ssh user@remote sh ./script.unx
。