【问题标题】:Using sshpass to run a command on another server使用 sshpass 在另一台服务器上运行命令
【发布时间】:2023-04-01 15:47:01
【问题描述】:
我正在尝试在服务器 X 上运行一个命令,以将该 SSH 连接到服务器 Y 并运行另一个命令
我正在这样做:
sshpass -p 'my_password' ssh -t test-admin@my_ip "sudo su c command_must_be_run_root --arguments"
所以分解一下:
- 我正在使用“sshpass”将密码传递到我的 ssh 命令中
- 我正在以“test-admin”用户的身份通过 SSH 连接到新服务器
- 一旦进入服务器,我正在运行命令
"sudo su command_must_be_run_root --arguments
- 此“command_must_be_run_root”是一个只能以 root 身份运行的命令
- 它还有我必须传入的参数。但是我看到,当我传入参数时,它会将这些参数传递给“su”命令,而不是将它们传递给我想要运行的新命令
关于如何解决这个问题的任何想法?
【问题讨论】:
标签:
bash
shell
ssh
sshpass
【解决方案1】:
无论出于何种原因,当您有一个带有参数的命令时,您实际上需要告诉sudo su 以root 登录。如果不先登录,它将运行命令的第一部分,即使所有命令都在单引号中,但不是 args。 (我猜它认为这是命令的结尾,或者每个sudo su -c 只有一个命令,这就是持久登录有效的原因?)。添加sudo su -l root 后,您可以继续使用-c,后面的所有内容都需要单引号。
应该是这样的:
sshpass -p 'my_password' ssh -t test-admin@my_ip "sudo su -l root -c 'command_ran_as_root --arguments'"
【解决方案2】:
我不认为su 命令在任何情况下都是有效的。 su 的语法是su <someuser> [arguments...],所以你写的内容是尝试以用户c 运行command_must_be_run_root。
我怀疑c 应该是-c,在这种情况下,您需要将参数引用到-c,这将解决您所询问的问题:
sshpass -p 'my_password' ssh -t test-admin@my_ip "sudo su -c 'command_must_be_run_root --arguments'"
但下一个问题是,如果您已经拥有sudo 访问权限,为什么还要打扰su?你可以改写:
sshpass -p 'my_password' ssh -t test-admin@my_ip sudo command_must_be_run_root --arguments