1

我正在尝试制作一个 bash 脚本,它将在我运行 ubuntu studio 的计算机上设置一个代理。这个 [1] 告诉我应该通过在 /etc/apt/apt.conf.d/ 中创建文件 95proxies 来为 apt-get 和 Update Manager 设置代理。

问题是当我运行这段代码时。

sudo echo "Acquire::http::proxy "http://myproxy.server.com:8080/";
Acquire::ftp::proxy "ftp://myproxy.server.com:8080/";
Acquire::https::proxy "https://myproxy.server.com:8080/";
" > /etc/apt/apt.conf.d/95proxies

我得到:

bash: /etc/apt/apt.conf.d/95proxies: Permission denied

我能够通过触摸创建文件

sudo touch /etc/apt/apt.conf.d/95proxies

但是当我将数据放入文件时,我仍然收到上面的错误消息。

[1] https://askubuntu.com/questions/150210/how-do-i-set-systemwide-proxy-servers-in-xubuntu-lubuntu-or-ubuntu-studio

4

3 回答 3

1

这本质上与“如何使用 sudo 将输出重定向到我无权写入的位置? ”中描述的问题相同。也就是说,即使您使用 运行echosudo也不echo是写入文件,而是您的外壳,并且您的外壳没有写入该文件的权限。

一种可能的解决方案是使用sudo诸如tee实际写入文件本身而不是依赖于 shell 的程序:

echo "Acquire::http::proxy \"http://myproxy.server.com:8080/\";" | sudo tee /etc/apt/apt.conf.d/95proxies > /dev/null

有关此问题的更多可能解决方案,请参阅如何使用 sudo 将输出重定向到我无权写入的位置?

于 2016-08-15T15:34:06.623 回答
0

试试下面的命令,

sudo sh -c '(echo "Acquire::http::proxy \"http://myproxy.server.com:8080/\";"; echo "Acquire::ftp::proxy \"ftp://myproxy.server.com:8080/\";"; echo "Acquire::https::proxy \"https://myproxy.server.com:8080/\";") > /etc/apt/apt.conf.d/95proxies'

由于/etc/apt/apt.conf.droot 拥有的目录,您必须echo在单独的子 shell 中运行该命令。

要通过echo命令向文件添加多行,语法为

(echo first line; echo second line) >> output file
于 2014-04-05T10:52:08.120 回答
0
sudo printf 'Acquire::http::proxy "http://myproxy.server.com:8080/;\nAcquire::ftp::proxy "ftp://myproxy.server.com:8080/;\nAcquire::https::proxy "https://myproxy.server.com:8080/;\n"' > /etc/apt/apt.conf.d/95proxies

要在文件中打印换行符 (\n),您必须使用 printf 而不是 echo。

在您的情况下,bash 将使用命令的每一行作为新命令(因为;, so> /etc/apt/apt.conf.d/95proxies将作为不带 sudo 的命令执行。

于 2014-04-05T11:07:04.777 回答