Sudo

使用 AND 命令切換到 sudo 使用者不起作用

  • November 6, 2020

我正在嘗試一次將 ssh 私鑰從一個使用者複製到另一個使用者。

sudo su && cp /home/sk/keys/master.pem /home/sg-user/keys/

當我一個一個地執行它們時,這一系列命令效果很好。但它顯示錯誤,

cp: cannot create regular file ‘/home/sg-user/keys/master.pem’: Permission denied

當我執行上面的命令時,它切換到 root 提示符,

root@sk-box:/home/sk# 

我試過

sudo su && cp /home/sk/keys/master.pem /home/sg-user/keys/ && exit

查看命令是否在完成任務後退出 root 終端。但是exit命令沒有任何作用,提示也不是從root session中出來的……

注意:sudo su已配置為不使用/etc/sudoers文件提示輸入密碼

執行命令時,它們會拆分為子程序,因此當“su”命令執行時,它將在與 cp 命令不同的程序中執行,而不是實際上在根終端內。

如果您使用 sudo 執行 cp,該命令將起作用,但它不會在根終端內執行,您必須在 su 中單獨執行命令才能完成此操作。

sudo su && sudo cp /home/sk/keys/master.pem /home/sg-user/keys/

‘sudo so &&’ 是多餘的,但如果你只是想完成複制。這應該是所有需要的:

sudo cp /home/sk/keys/master.pem /home/sg-user/keys/
sudo su && cp /home/sk/keys/master.pem /home/sg-user/keys/

這將執行命令sudo susudo su以 root 身份執行互動式 shell,它基本上等同於sudo -sor sudo bash(如果你的 shell 是 bash)。此命令完成後,如果返回成功狀態,則以cp原始使用者身份執行該命令。

就shell而言,sudo是一個普通的命令,不是特殊的shell語法。因此,與任何其他命令一樣,&&它是一個命令分隔符,首先執行其左側的命令,然後執行其右側的命令(如果第一個命令成功)。

 sudo su && cp /home/sk/keys/master.pem /home/sg-user/keys/ && exit

此變體的作用相同,只是它在sudo su返回後退出父 shell 並且文件已被複製(假設這些操作成功)。該su命令執行一個互動式 shell,它執行您將其作為輸入傳遞的命令,而不是父 shell 稍後將執行的命令。

如果你想以 root 身份執行兩個命令,只有在第一個成功時才執行第二個,你可以呼叫sudo兩次:

sudo command1 && sudo command2

或者您可以sudo呼叫一個 shell 並&&在該嵌套 shell 中使用運算符:

sudo sh -c 'command1 && command2'

在你的情況下,你只執行一個命令,所以它只是

sudo cp /home/sk/keys/master.pem /home/sg-user/keys/

sudo su基本上總是沒用的,因為sudosu都是用來換使用者的。由於sudo已經以 root 身份執行指定的命令,su因此是多餘的。這只是以 root 身份執行 shell,您可以使用sudo su.

引用自:https://unix.stackexchange.com/questions/209517