Dar*_*eep 90 shell sudo io-redirection quoting
我正在尝试遵循我认为使用 sudo 而不是 root 帐户的最佳实践。
我正在运行一个简单的 concat 文件操作,例如:
sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
Run Code Online (Sandbox Code Playgroud)
这在以普通用户身份运行的“>>”右侧失败。添加额外的 sudo 也会失败(由于管道到 sudo 命令而不是文件的预期行为)。
示例仅此而已,但已在 root 帐户下进行了验证和测试。
Chr*_*own 115
您可以以 root 身份调用一个新的 shell:
sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'
Run Code Online (Sandbox Code Playgroud)
您也可以只提升进程以写入文件:
sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF
Run Code Online (Sandbox Code Playgroud)
        ter*_*don 23
另一种同样安全的选择是使用sudo's-i开关以 root 身份登录:
$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'
Run Code Online (Sandbox Code Playgroud)
这仍然遵循最佳实践规则,因为实际上并没有启用 root 帐户,但可以让您以 root 身份安全地执行操作。来自man sudo:
The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 
Run Code Online (Sandbox Code Playgroud)
        Gil*_*il' 16
如果您在没有单引号的情况下表达您的命令,您可以将它放在单引号内并通过中间 shell 执行它。
要以 root 身份执行此操作:
echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
Run Code Online (Sandbox Code Playgroud)
以不使用的不同方式编写命令':
echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock
Run Code Online (Sandbox Code Playgroud)
然后调用sudo sh -c …:
sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'
Run Code Online (Sandbox Code Playgroud)
或者,要将输出写入只有 root 可以写入的文件,请调用sudo tee. 将-a选项传递tee给附加到目标文件,否则文件将被截断。
echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null
Run Code Online (Sandbox Code Playgroud)
对于更复杂的文件修改,您可以调用sudo sed, sudo ed, sudo perl, ...
或者,使用一个不错的编辑器并将其称为 sudo。在 Emacs 中,打开/sudo:/etc/conf.d/hwclock. 在 Vim 中,调用:w !sudo tee %以 root 身份写入打开的文件,或使用sudo.vim 插件。或者从 sudo 结束并调用sudoedit /etc/conf.d/hwclock.
或者你可以屈服于黑暗面并以 root 身份运行 shell。
$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
Run Code Online (Sandbox Code Playgroud)
        Cir*_*郝海东 10
sudo dd of=
根据需要追加:
echo inbytes | sudo dd of=outfile oflag=append conv=notrunc
Run Code Online (Sandbox Code Playgroud)
或者从头开始重新创建文件:
echo inbytes | sudo dd of=outfile
Run Code Online (Sandbox Code Playgroud)
好处:
tee没有/dev/null重定向更好sh没有子外壳更好dd有许多强大的选项,例如status=progress查看传输进度之所以有效,是因为 sudo 将 stdin 转发给命令。
由于重定向到的文件的权限,该命令失败。重定向甚至在sudo调用命令之前发生。
您必须确保实际打开文件进行写入的是 root。
最简单的方法:
echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null
Run Code Online (Sandbox Code Playgroud)
的echo,因为它只是产生一个字符串,可以运行你的普通用户。该tee实用程序必须以 root 身份运行,tee -a并将附加数据。我们将输出重定向到/dev/null因为tee,默认情况下,除了写入指定的文件之外,还会将其输入数据复制到其标准输出。
使用bash或任何理解“here-strings”的shell:
sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'
Run Code Online (Sandbox Code Playgroud)
这与上述效果相同。只有我们产生字符串的方式发生了变化。
另一种稍微迂回的做法:
sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'
Run Code Online (Sandbox Code Playgroud)
在这里,重定向发生在sh -c以 root 身份运行的子 shell 中。
或者,将要附加的行作为参数添加到sh -c以 root 身份运行的shell 中:
sudo sh -c 'printf "%s\n" "$1" >>/etc/conf.d/hwclock' sh 'clock_hctosys="YES"'
Run Code Online (Sandbox Code Playgroud)
...可以概括为将所有参数作为行添加到文件的内容:
set -- 'line 1' 'line 2' 'line 3'
sudo sh -c 'printf "%s\n" "$@" >>/etc/conf.d/hwclock' sh "$@"
Run Code Online (Sandbox Code Playgroud)