sudo无法cd和重定向的问题

sudo用来临时切换用户身份,但如果是这样的情况:

 

  1. #more /etc/sudoers 
  2.  
  3. test1 ALL=(ken.zhang) ALL   # test1可以sudo到ken.zhang身份执行任何命令 
  4.  
  5. $id -u -n 
  6.  
  7. test1 
  8.  
  9. $pwd 
  10.  
  11. /home 
  12.  
  13. $ls -l 
  14.  
  15. -rwx------ 1 ken.zhang ken.zhang   38 Nov 10 01:58 ken.sh 
  16. drwx------ 2 ken.zhang ken.zhang 4096 Nov 10 01:57 ken.zhang 
  17. drwx------ 2 test1     test1     4096 Nov 10 01:58 test1 
  18.  
  19. $cd ken.zhang/ 
  20.  
  21. -bash: cd: ken.zhang: Permission denied 
  22.  
  23. $./ken.sh 
  24.  
  25. -bash: cd: ken.zhang: Permission denied 
  26.  
  27. $sudo -u ken.zhang ./ken.sh      #以ken.zhang身份执行ken.sh可以成功 
  28.  
  29. hello world 
  30.  
  31. $sudo -u ken.zhang cd ken.zhang   #以ken.zhang身份无法进入ken.zhang目录 
  32.  
  33. sudo: cd: command not found 

原因是因为cd是shell的内建命令,不是普通命令,sodu切换只能执行普通命令和用户程序。

如果确实需要运行cd,可以先输入sudo -s,然后就可以运行cd了,不过发现变成root@hostname了,也就是说变成root登陆了.


引用一段比较好的英文解释
cd is a shell built-in command. It cannot be run in a child process. The child process simply cannot change the working directory of its parent shell process.
Redirection also does not work with sudo for the same reason (redirection being a shell "thing")
sudo 'ls /root/restricted >/root/out.txt'

sudo: ls /root/restricted >/root/out.txt: command not found

这里也说了重定向也是无法sudo的,如果需要sudo重定向,如何解决呢?

解决这一问题的途径有两种。

第一种是利用 "sh -c" 命令,它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:

  1. sudo sh -c 'echo 123456 > /tmp/test.txt' 

另一种方法是利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下: 

  1. echo "123456 " | sudo tee -a test.txt 

注意,tee 命令的 "-a" append选项的作用等同于 ">>" 命令,如果去除该选项,那么 tee 命令的作用就等同于 ">" 命令。


此时回到前面的无法cd到ken.zhang目录下我们就可以这样解决  

  1. $sudo -u ken.zhang sh -c 'cd ken.zhang;pwd;ls -l' 
  2.  
  3. /home/ken.zhang 
  4.  
  5. total 36 
  6.  
  7. -rw-rw-r-- 1 root      root       0 Oct 29 19:29 file1 
  8. -rw-rw-r-- 1 ken.zhang ken.zhang 24 Nov  9 06:53 ken.zhang.cron 
  9. -rwxr-xr-x 1 ken.zhang ken.zhang  9 Oct 29 20:07 ls 
  10. -rw-r--r-- 1 root      root      86 Oct 29 20:02 temp 
  11. -rwxr-xr-x 1 root      root      38 Oct 29 19:19 test1.sh 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章