我正在尝试一次性将 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
查看命令在完成任务后是否退出根终端。但是 exit 命令没有任何效果,提示也不会从 root 会话中出来......
注意:sudo su
已配置为使用/etc/sudoers
文件不提示输入密码
答案1
当命令运行时,它们会分成一个子进程,因此当“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/
答案2
sudo su && cp /home/sk/keys/master.pem /home/sg-user/keys/
这将运行命令sudo su
。sudo su
以 root 身份运行交互式 shell,它基本上相当于sudo -s
or 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 运行您作为输入传递给它的命令,而不是父 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
基本上总是没用的,因为sudo
和su
都是用来改变用户的。由于sudo
已经以 root 身份运行指定的命令,su
因此是多余的。这只是以 root 身份运行 shell,您可以使用sudo su
.
答案3
你应该试试
sudo cp /home/sk/keys/master.pem /home/sg-user/keys/