簡體   English   中英

如何 sudo su; 然后運行命令

[英]How to sudo su; then run command

誰能幫我解決以下問題

我需要通過例如ubuntu用戶 ssh 到另一台服務器,該用戶肯定有權運行 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案例它以某種方式掛起並且不響應

除非您有一個不尋常的設置,否則您通常不能將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調用中的引號中也可能很有用。

使用su -c選項來指定命令

來自man su

特別是, -c 的參數將導致大多數命令解釋器將下一個參數視為命令。 該命令將由 /etc/passwd 中為目標用戶指定的 shell 執行。

CMD="sudo su -c  \"pm2 restart 0; pm2 restart 1;\""

您需要引用擴展,以便在遠程端解析整個字符串。

ssh -i somepemfile.pem ubuntu@1.1.1.1 "$CMD"

否則,擴展會受到分詞,遠程 shell 會得到一個由命令sudo和參數su;組成的字符串su; , restart , 0; , pm2 , restart; , 1; ,然后exit; . 也就是說,當ssh根據您傳遞的單獨參數構建單個字符串時,它會轉義分號。

但是,這並不能解決在sudo啟動的 shell 中運行pm2的問題。 這由ramki解決。

su 通常會將您置於子 shell 中,您可以通過回顯當前 PID(進程 ID)來查看該子 shell

$ 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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM