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