以非交互方式在远程服务器上执行 bash 脚本

Ama*_*ngh 6 server ssh command-line bash scripts

我有一个 bash 脚本,它只接受 3 个参数,并且我在 PHP 中创建了一个 Web 界面来在远程服务器上运行这个脚本。用户只需输入远程服务器的用户名主机和密码。

我发现这个命令可以在远程服务器上执行 bash 脚本:

ssh root@host 'bash -s' < script.sh
Run Code Online (Sandbox Code Playgroud)

但是这个命令会提示输入密码并且不使用任何参数。但我需要一些可以非交互式运行的东西。

就像是:

ssh root@host -password="password" 'bash -s' < script.sh
Run Code Online (Sandbox Code Playgroud)

Rav*_*ina 6


确保您已阅读安全注意事项


安装sshpass它是一个用于非交互式 ssh 密码身份验证的工具。

sudo apt install sshpass
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

sshpass -p 'password' ssh user@server/IP
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它来运行带有参数的脚本:

sshpass -p 'password' ssh user@server "bash -s" < ./script.sh arg1 arg2
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,那么我建议使用scp并将您的脚本移动到远程服务器,然后运行您的命令并删除脚本:

sshpass -p 'password' scp script.sh user@server:/tmp/script.sh
sshpass -p 'password' ssh user@server /tmp/script.sh arg1 ar2 arg3
sshpass -p 'password' ssh user@server rm /tmp/script.sh
Run Code Online (Sandbox Code Playgroud)

安全考虑[man sshpass]

首先,sshpass 的用户应该意识到,ssh 坚持只以交互方式获取密码并非没有道理。安全地存储密码几乎是不可能的,sshpass 的用户应该考虑 ssh 的公钥认证是否提供相同的最终用户体验,同时涉及更少的麻烦和更安全。

-p 选项应该被认为是所有 sshpass 选项中最不安全的。所有系统用户都可以使用简单的“ps”命令在命令行中查看密码。Sshpass 极少尝试隐藏密码,但这种尝试注定会造成竞争条件,而没有真正解决问题。鼓励 sshpass 的用户使用其他密码传递技术之一,它们都更安全。

特别是,鼓励编写旨在以编程方式传达密码的程序的人使用匿名管道,并使用 -d 选项将管道的读取端传递给 sshpass。