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 

 

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