任何人都可以帮助我解决以下问题
我需要通过例如SSH到另一台服务器ubuntu
个有权运行sudo su (肯定)然后执行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
情况下,它以某种方式挂起并且没有响应
答案 0 :(得分:3)
除非您进行了不寻常的设置,否则通常无法将字符串su
与其他类似的前面的命令一起使用。我可以想象它正在运行sudo su
,然后挂在根环境/会话中,因为它在等待pm2
命令之前正在等待您退出。相反,我会使用-c
选项考虑一些类似的事情:
CMD="sudo su -c 'pm2 restart 0; pm2 restart 1'"
ssh -i somepemfile.pem ubuntu@1.1.1.1 "$CMD"
正如另一个答案中所建议的那样,将$CMD
变量封装在ssh
调用中的引号中可能也很有用。
答案 1 :(得分:2)
使用-c
的{{1}}选项来指定命令
来自su
尤其是,-c的参数将导致大多数命令解释器将下一个参数视为命令。该命令将由在中指定的shell执行 / etc / passwd作为目标用户。
man su
答案 2 :(得分:1)
您需要引用扩展名,以便在远程端解析整个字符串。
ssh -i somepemfile.pem ubuntu@1.1.1.1 "$CMD"
否则,扩展将进行分词,并且远程外壳程序将获得一个字符串,该字符串包含命令sudo
和参数su;
,restart
,0;
,pm2
,restart;
,1;
和exit;
。也就是说,ssh
将根据您传递的单独参数构建单个字符串时将转义分号。
但是,这不能解决在pm2
开始的shell中运行sudo
的问题。 RamKrish2079解决了这个问题。
答案 3 :(得分:1)
su通常会将您置于一个子外壳中,您可以通过回显当前的PID(进程ID)来看到它
$ echo $$
94260
$ sudo echo $$
94260
$ sudo su
$ echo $$
94271
但是要解决这个问题,您可以像这样用管道输送要运行的命令
$ 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。添加-t选项,该选项在远程执行期间分配TTY。
$ 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'