为什么须藤猫的许可给予否认,但须藤vim的正常工作?(Why sudo cat gives a Pe

2019-07-28 23:14发布

我想自动加在我的弓的pacman.conf的文件的存储源,但使用的echo在我的shell脚本命令。 但是,它未能像这样: -

sudo echo "[archlinuxfr]" >> /etc/pacman.conf
sudo echo "Server = http://repo.archlinux.fr/\$arch" >> /etc/pacman.conf
sudo echo " " >> /etc/pacman.conf

-bash: /etc/pacman.conf: Permission denied

如果我更改通过做手工/etc/pacman.conf中使用vim,

sudo vim /etc/pacman.conf

并在quiting VIM有:wq ,一切工作正常,我的pacman.conf的已不被手动更新“权限被拒绝”的投诉。

为什么会这样? 而且我怎么sudo echo工作? (顺便说一句,我尝试使用sudo cat太多,但未能与拒绝权限以及)

Answer 1:

问题是,重定向是由你原来的外壳处理,而不是由sudo 。 壳是不能够读出头脑,不知道该特定>>意味着对sudo ,而不是它。

你需要:

  1. 引用重定向(所以它是在以传递sudo)
  2. 使用sudo -s (使sudo使用外壳来处理引用重定向。)


Answer 2:

作为@geekosaur解释,shell就重定向运行命令。 当你输入:

sudo foo >/some/file

您当前的shell进程,使自身的副本,首先尝试打开/some/file写入,然后让该文件描述它的标准输出,然后才执行sudo

如果你被允许(sudoer CONFIGS经常使运行壳),你可以这样做:

sudo bash -c 'foo >/some/file'

但我发现,一般一个好的解决方案是使用| sudo tee | sudo tee代替>| sudo tee -a | sudo tee -a ,而不是>> 。 这是特别有用,如果重定向是我所需要的唯一原因sudo摆在首位; 毕竟,不必要正在运行的进程的根正是sudo是为了避免。 运行echo作为根仅仅是愚蠢的。

echo '[archlinuxfr]' | sudo tee -a /etc/pacman.conf >/dev/null
echo 'Server = http://repo.archlinux.fr/$arch' | sudo tee -a /etc/pacman.conf >/dev/null
echo ' ' | sudo tee -a /etc/pacman.conf >/dev/null

我加入> /dev/null就完了,因为tee将其输出到指定的文件自己的标准同时输出,而且我不需要看到它我的终端上。 (该tee就像在物理管道中的“T”型连接,这是它得名。命令行为)我切换到单引号( ' ... ' ),而不是双打( " ... " ),以便一切是文字,我并没有把一个反斜杠在前面$$arch

所以这需要写入使用文件作为根的护理sudo 。 现在对于在shell脚本的方式来输出包含换行符文本冗长的题外话。 :)

首先,你可以组所有的echo的一起在一个子shell,所以你只需要做重定向一次:

(echo '[archlinuxfr]
 echo 'Server = http://repo.archlinux.fr/$arch'
 echo ' ') | sudo tee -a /etc/pacman.conf >/dev/null

或使用printf替代echo ,这样你就可以直接嵌入到新行使用字符串\n

printf '[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' | 
  sudo tee -a /etc/pacman.conf >/dev/null

bash ,你可以得到相同的结果echo -e

# BASH ONLY - NOT RECOMMENDED
echo -e '[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' | 
  sudo tee -a /etc/pacman.conf >/dev/null

但大多数炮弹将只输出-e当你尝试,所以不推荐使用。

随着双方printfecho -e ,命令得到什么作为参数字符串包含AA反斜线后跟一个文字ñ无论你输入\n ,它的最高命令程序本身(代码里面printfecho )翻译说成一个换行符。 在许多现代的炮弹,你必须使用ANSI的选项报价$' ...... ' ,这将转化序列像\n文本换行命令程序曾经看到字符串,这意味着这样的字符串不与任何命令前工作:

echo $'[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' | 
  sudo tee -a /etc/pacman.conf >/dev/null

但是,虽然比更便携echo -e ,ANSI报价仍然是一个非POSIX扩展。

我的首选这样做的方法是使用此文档,避免了需要echoprintf全部:

sudo tee -a /etc/pacman.conf >/dev/null <<'EOF'
[archlinuxfr]
Server = http://repo.archlinux.fr/$arch

EOF


Answer 3:

http://www.innovationsts.com/blog/?p=2758

由于指令不说清楚上面,我是使用来自博客文章的说明。 举例所以很容易地看到你需要做什么。

$ sudo的猫/root/example.txt | 的gzip> /root/example.gz
-bash:/root/example.gz:权限被拒绝

请注意,它在导致错误管道的第二个命令(gzip命令)。 这就是我们使用bash -c选项的技术的用武之地。

$ sudo的庆典-c“猫/root/example.txt | 的gzip> /root/example.gz”
$ sudo的LS /root/example.gz
/root/example.gz

我们可以看到形成ls命令的输出,该压缩文件创建成功。

第二种方法是类似之处在于我们传递命令字符串来砸第一,但我们正在通过sudo管道做。

$ sudo的RM /root/example.gz
$回声 “猫/root/example.txt |的gzip> /root/example.gz” | sudo的庆典
$ sudo的LS /root/example.gz
/root/example.gz



Answer 4:

sudo bash -c 'echo "[archlinuxfr]" >> /etc/pacman.conf'


Answer 5:

第1步创建在bash文件中的函数( write_pacman.sh

#!/bin/bash

function write_pacman {
 tee -a /etc/pacman.conf > /dev/null << 'EOF'
  [archlinuxfr]
  Server = http://repo.archlinux.fr/\$arch
EOF
}

'EOF'不会解释$arch变量。

STE2源的bash文件

$ source write_pacman.sh

步骤3执行功能

$ write_pacman


文章来源: Why sudo cat gives a Permission denied but sudo vim works fine?