[ 已解决 ] 关于普通用户和 root 用户的命令不相同的问题

马上去试试

Sent from my Galaxy Nexus using Tapatalk 2

按照你说运行了,我贴上来
strangk@linux-e1ks:~> which shutdown
which: no shutdown in (/home/strangk/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games)
strangk@linux-e1ks:~> sudo which shutdown
/sbin/shutdown
strangk@linux-e1ks:~> echo ‘echo $PATH’ | sudo sh
/usr/bin:/bin:/usr/sbin:/sbin
strangk@linux-e1ks:~> sudo echo ‘echo $PATH’ | sudo sh
/usr/bin:/bin:/usr/sbin:/sbin
strangk@linux-e1ks:~> sudo sudo -V
Sudo 版本 1.8.6p3
当前选项:–host=i586-suse-linux-gnu --build=i586-suse-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib --libexecdir=/usr/lib --localstatedir=/var --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --disable-dependency-tracking --libexecdir=/usr/lib/sudo --docdir=/usr/share/doc/packages/sudo --with-noexec=/usr/lib/sudo/sudo_noexec.so --with-pam --with-ldap --with-selinux --with-linux-audit --with-logfac=auth --with-insults --with-all-insults --with-ignore-dot --with-tty-tickets --enable-shell-sets-home --enable-warnings --with-sendmail=/usr/sbin/sendmail --with-sudoers-mode=0440 --with-env-editor --without-secure-path --with-passprompt=%p’s password: --with-timedir=/var/lib/sudo
Sudoers 策略插件版本 1.8.6p3
Sudoers 文件语法版本 42

Sudoers 路径:/etc/sudoers
nsswitch 路径:/etc/nsswitch.conf
ldap.conf 路径:/etc/ldap.conf
ldap.secret 路径:/etc/ldap.secret
认证方法: ‘pam’
若使用了 syslog,用于记录日志的 syslog 设施:auth
用户认证成功时使用的 syslog 优先级:notice
用户认证不成功时使用的 syslog 优先级:alert
忽略 $PATH 中的“.”
在用户不在 sudoers 列表中时发送邮件
对每个用户/终端组合使用独立的时间戳
在用户第一次运行 sudo 时向他致辞
默认要求用户认证
root 可以运行 sudo
若使用 -s 选项启动 shell,将 $HOME 设为目标用户的主目录
总是将 $HOME 设为目标用户的主目录
允许收集一些信息,以提供有用的错误消息
Visudo 将优先考虑 EDITOR 环境变量
询问目标用户的密码,而非用户密码
设置 LOGNAME 和 USER 环境变量
日志文件折行的长度(0 则不折行):80
认证时间戳延时:5.0 分钟
密码提示延时:5.0 分钟
输入密码的尝试次数:3
要使用的 umask,或 0777 使用用户的:022
邮件程序路径:/usr/sbin/sendmail
邮件程序标志:-t
发送邮件的地址:root
邮件消息的主题行:*** SECURITY information for %h ***
密码错误消息:Sorry, try again.
认证时间戳文件夹的路径:/var/lib/sudo
默认密码提示:%p’s password:
运行命令的默认用户:root
visudo 所使用的编辑器的路径:/usr/bin/vi
何时为“list”伪命令请求密码:any
何时为“verify”伪命令请求密码:all

= 3 的文件描述符将会在执行命令前关闭
将环境重设为默认的变量集
要检查完整性的环境变量:
TERM
LINGUAS
LC_*
LANGUAGE
LANG
COLORTERM
要移除的环境变量:
RUBYOPT
RUBYLIB
PYTHONUSERBASE
PYTHONINSPECT
PYTHONPATH
PYTHONHOME
TMPPREFIX
ZDOTDIR
READNULLCMD
NULLCMD
FPATH
PERL5DB
PERL5OPT
PERL5LIB
PERLLIB
PERLIO_DEBUG
JAVA_TOOL_OPTIONS
SHELLOPTS
GLOBIGNORE
PS4
BASH_ENV
ENV
TERMCAP
TERMPATH
TERMINFO_DIRS
TERMINFO
RLD*
LD
*
PATH_LOCALE
NLSPATH
HOSTALIASES
RES_OPTIONS
LOCALDOMAIN
CDPATH
IFS
要保留的环境变量:
XDG_SESSION_COOKIE
LINGUAS
LANGUAGE
LC_ALL
LC_TIME
LC_TELEPHONE
LC_PAPER
LC_NUMERIC
LC_NAME
LC_MONETARY
LC_MESSAGES
LC_MEASUREMENT
LC_IDENTIFICATION
LC_COLLATE
LC_CTYPE
LC_ADDRESS
LANG
解析 sudoers 时使用的区域设置:C
使用 zlib 压缩 I/O 日志
用于保存输入/输出日志的目录:/var/log/sudo-io
用于保存输入/输出日志的文件:%{seq}
在分配伪终端时向 utmp/utmpx 文件中添加一条记录

本地 IP 地址和网络掩码对:
192.168.1.100/255.255.255.0
fe80::5eac:4cff:fe96:9647/ffff:ffff:ffff:ffff::

Sudoers I/O plugin version 1.8.6p3

我看你的配置信息应该是可以执行的呀。你执行下

sudo shutdown -k

然后把输入贴给我看下。注意把执行该命令时的那一行也贴出来。

不好意思刚上床,直接运行 sudo shutdown -k 是不行的,会提示找不到命令,如果写完 sudo shutdown 之后按一下 tab 补全命令,会显示 sudo /sbin/shutdown,这样就可以运行了

Sent from my Galaxy Nexus using Tapatalk 2

strangk@linux-e1ks:~> sudo shutdown -k
sudo:shutdown:找不到命令
strangk@linux-e1ks:~> sudo /sbin/shutdown -k #这里在写完shutdown之后按了一下tab就成了/sbin/shutdown
Shutdown scheduled for Tue, 2013-04-16 08:15:57 CST, use ‘shutdown -c’ to cancel.
strangk@linux-e1ks:~>
Broadcast message from root@linux-e1ks.site (Tue, 2013-04-16 08:14:57 CST):

The system is going down for power-off at Tue, 2013-04-16 08:15:57 CST!

问题有点奇怪了。
你这样修改试试,看能解决问题不。编辑 ~/.bashrc
在末尾添加一行

alias sudo="PATH=$PATH:/sbin:/usr/sbin sudo"

然后运行

source ~/.bashrc

好的,等下我试试,这样把 PATH 写上应该是没问题的

Sent from my Galaxy Nexus using Tapatalk 2

你的 sudo 编译的时候 SECURE_PATH 选项打开的吗?如果没有打开的话,sudo 是随当前用户的 PATH 的。运行下面的命令可以知道:

sudo -L|grep -i secure_path

我是直接用的系统安装自动设定的,没有自己编译 sudo

Sent from my Galaxy Nexus using Tapatalk 2

你运行下我上面说的命令

sudo -L|grep -i secure_path

默认安装的,可能也是用的不同编译参数。如果没有输出结果,说明编译时没有 --with-secure-path 参数的。

运行了一下,输出是这样的
strangk@linux-e1ks:~> sudo -L|grep -i secure_path
sudo:无效选项 – L
usage: sudo -D level] -h | -K | -k | -V
usage: sudo -v -AknS] -D level] -g groupname|#gid] -p prompt] -u user name|#uid]
usage: sudo -l[l] -AknS] -D level] -g groupname|#gid] -p prompt] -U user name] -u user name|#uid] -g groupname|#gid] [command]
usage: sudo -AbEHknPS] -r role] -t type] -C fd] -D level] -g groupname|#gid] -p prompt] -u user name|#uid] -g groupname|#gid] [VAR=value]
-i|-s] ]
usage: sudo -e -AknS] -r role] -t type] -C fd] -D level] -g groupname|#gid] -p prompt] -u user name|#uid] file …

我把这一行添加到.bashrc 中就行了,事后我查看了一下各个用户的PATH
当前普通用户的PATH是

declare -x PATH="/home/strangk/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games"

sudo su 之后的用户PATH是

declare -x PATH="/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games"

su - 之后的的用户PATH是

declare -x PATH="/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games"

也就是说,就差这几个目录,除了在.bashrc 中写入PATH,还有什么办法?重新编译sudo,用上那个 secure 的选项吗

为什么大家不用 poweroff 呢。。。

shutdown 会调用 init 脚本,然后安全停止所有服务再关闭电源; poweroff 则是直接关闭电源。

------ 从我使用 Tapatalk 的海尔全自动洗衣机发出。