首页 > 解决方案 > 如何 sudo su; 然后运行命令

问题描述

谁能帮我解决以下问题

我需要通过例如ubuntu有权运行 sudo su 的用户ssh 到另一台服务器,然后执行pm2 restart 命令

完整的命令看起来像这样

#!/bin/sh
CMD="sudo su; pm2 restart 0; pm2 restart 1; exit;"  
ssh -i somepemfile.pem ubuntu@1.1.1.1 $CMD

例如,我可以使用 sudo 正常运行任何命令

CMD="sudo /etc/init.d/apache2 restart"  

sudo su如果它以某种方式挂起并且不响应

标签: bashsudopm2

解决方案


su 通常会将您置于子 shell 中,您可以通过回显当前 PID(进程 ID)来查看

$ echo $$
94260
$ sudo echo $$
94260
$ sudo su
$ echo $$
94271

但是要解决这个问题,您可以像这样将要运行的命令传递给 su

$ echo "whoami" | sudo su
root

我们运行多个命令

$ echo "uptime;whoami" | sudo su
11:29  up 8 days, 19:20, 4 users, load averages: 4.55 2.96 2.65
root

现在使用 ssh 进行这项工作

$ ssh wderezin@localhost 'echo "uptime;whoami" | sudo su'
sudo: no tty present and no askpass program specified

该死,我们需要为 su 命令分配一个 tty。添加在远程执行期间分配 TTY 的 -t 选项。

$ ssh -t wderezin@localhost 'echo "uptime;whoami" | sudo su'
11:36  up 8 days, 19:26, 5 users, load averages: 2.97 2.97 2.76
root

你的命令看起来像这样

ssh -i somepemfile.pem ubuntu@1.1.1.1 'echo "pm2 restart 0; pm2 restart1" | sudo su'


推荐阅读