用 sudo 巧妙重定向输出到受限目录

我已经获得了我们开发用的 RedHat Linux 服务器之一的 sudo 访问权限,我似乎经常需要将输出重定向到我通常没有写入权限的位置。

麻烦在于,这个人为构造的例子不能正常工作:

sudo ls -hal /root/ > /root/test.out

我只收到响应 :

-bash: /root/test.out: Permission denied

我怎么才能让它工作?

你的命令之所以不工作,因为重定向是由你的 shell 执行的,而你的 shell 没有权限写入到 /root/test.out。输出的重定向不是由 sudo 执行的。

你可以使用 sudo 命令结合 tee 命令将输出重定向到你没有写入权限的位置。tee 命令从标准输入读取并将其写入标准输出和文件。当与 sudo 一起使用时,它允许你将输出写入需要超级用户权限的位置。

以下是实现此操作的方法:

sudo command | sudo tee /path/to/output

在这个命令中:

  • 在命令之前的 sudo 允许以超级用户权限执行命令。
  • |(管道符)将前面命令的标准输出发送到后续命令的标准输入。
  • 第二个 sudo tee /path/to/output 允许将输出写入指定位置,即 /path/to/output,而你通常没有写入权限。

例如,如果要将命令 my_command 的输出写入需要超级用户权限的文件 /var/log/output.log,你可以使用:

sudo my_command | sudo tee /var/log/output.log

运行此命令时,首先使用 sudo 处理 my_command 的输出以获取必要的权限,然后再次使用 sudotee 将输出写入 /var/log/output.log

请务必谨慎使用 sudo,因为它授予了重要的权限,同时必须确保命令及其效果的准确性。

针对这一问题,还有如下几种解决方法:

  • 使用 sudo 运行一个 Shell,并通过 -c 选项传递命令:
sudo sh -c 'ls -hal /root/ > /root/test.out'

这样,命令及其重定向将在具有提升权限的 Shell 环境中执行。

  • 创建一个包含命令的脚本,并使用 sudo 运行该脚本:
#!/bin/sh
ls -hal /root/ > /root/test.out

创建好脚本后,执行以下命令以提升权限运行:

sudo ./ls.sh
  • 使用 sudo -s 启动一个具有提升权限的 Shell,然后在其中执行命令:
[nobody@so]$ sudo -s
[root@so]# ls -hal /root/ > /root/test.out
[root@so]# ^D  # Ctrl+D,退出具有提升权限的 Shell
[nobody@so]$ 

在开启的具有超级用户权限的 Shell 中执行命令并完成重定向操作,完成后使用 Ctrl+D 退出。

  • 使用 sudo 命令结合 dd 命令
sudo ls -lha /root/ | sudo dd of=/root/test.out
  • 使用 Here Documents
sudo bash <<EOF
ls -hal /root/ > /root/test.out
EOF

参考:

  • stackoverflow question 82256
  • man tee
  • man dd
  • https://www.gnu.org/software/bash/manual/bash.html#Here-Documents


  相关阅读:

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值