非交互地在远程服务器上执行 bash 脚本

非交互地在远程服务器上执行 bash 脚本

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

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

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

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

就像是:

ssh root@host -password="password" 'bash -s' < script.sh

答案1


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


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

sudo apt install sshpass

你可以像这样使用它:

sshpass -p 'password' ssh user@server/IP

然后像这样使用它及其参数来运行脚本:

sshpass -p 'password' ssh user@server "bash -s" < ./script.sh arg1 arg2

如果它不起作用那么我建议使用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

安全注意事项[管理员 sshpass]

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

-p 选项应被视为 sshpass 所有选项中最不安全的。所有系统用户都可以使用简单的“ps”命令在命令行中查看密码。Sshpass 会尽量隐藏密码,但这种尝试注定会产生竞争条件,而实际上并不能解决问题。建议 sshpass 用户使用其他密码传递技术之一,这些技术都更安全。

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

相关内容