sudo用來臨時切換用戶身份,但如果是這樣的情況:
- #more /etc/sudoers
- test1 ALL=(ken.zhang) ALL # test1可以sudo到ken.zhang身份執行任何命令
- $id -u -n
- test1
- $pwd
- /home
- $ls -l
- -rwx------ 1 ken.zhang ken.zhang 38 Nov 10 01:58 ken.sh
- drwx------ 2 ken.zhang ken.zhang 4096 Nov 10 01:57 ken.zhang
- drwx------ 2 test1 test1 4096 Nov 10 01:58 test1
- $cd ken.zhang/
- -bash: cd: ken.zhang: Permission denied
- $./ken.sh
- -bash: cd: ken.zhang: Permission denied
- $sudo -u ken.zhang ./ken.sh #以ken.zhang身份執行ken.sh可以成功
- hello world
- $sudo -u ken.zhang cd ken.zhang #以ken.zhang身份無法進入ken.zhang目錄
- 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 的影響範圍擴展到整條命令。具體用法如下:
- sudo sh -c 'echo 123456 > /tmp/test.txt'
另一種方法是利用管道和 tee 命令,該命令可以從標準輸入中讀入信息並將其寫入標準輸出或文件中,具體用法如下:
- echo "123456 " | sudo tee -a test.txt
注意,tee 命令的 "-a" append選項的作用等同於 ">>" 命令,如果去除該選項,那麼 tee 命令的作用就等同於 ">" 命令。
此時回到前面的無法cd到ken.zhang目錄下我們就可以這樣解決
- $sudo -u ken.zhang sh -c 'cd ken.zhang;pwd;ls -l'
- /home/ken.zhang
- total 36
- -rw-rw-r-- 1 root root 0 Oct 29 19:29 file1
- -rw-rw-r-- 1 ken.zhang ken.zhang 24 Nov 9 06:53 ken.zhang.cron
- -rwxr-xr-x 1 ken.zhang ken.zhang 9 Oct 29 20:07 ls
- -rw-r--r-- 1 root root 86 Oct 29 20:02 temp
- -rwxr-xr-x 1 root root 38 Oct 29 19:19 test1.sh