在我的主文件夹中有一个名为foo.sh的脚本。
当我导航到这个文件夹,并输入./foo.sh时,我得到
-bash: ./foo.sh:拒绝访问。
当我使用sudo ./foo.sh时,我得到
Sudo: foo.sh:命令未找到。
为什么会发生这种情况,我该如何解决?
在我的主文件夹中有一个名为foo.sh的脚本。
当我导航到这个文件夹,并输入./foo.sh时,我得到
-bash: ./foo.sh:拒绝访问。
当我使用sudo ./foo.sh时,我得到
Sudo: foo.sh:命令未找到。
为什么会发生这种情况,我该如何解决?
当前回答
检查sudo上的secure_path
[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
如果$PATH正在被覆盖,使用visudo并编辑/etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
其他回答
似乎linux会说“命令未找到”,即使你显式地给出了文件的路径。
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0
这是一个有点误导人的错误,但从技术上来说可能是正确的。文件在可执行之前不是命令,因此无法找到。
如果上面的指南有问题,请尝试chmod u+x foo.sh,而不是chmod +x foo.sh。当其他的解都没有的时候,这个对我有用。
到目前为止,我在这里看到的其他解决方案都是基于一些系统定义,但实际上,只要正确调用它,就可以让sudo使用当前的PATH(使用env命令)和/或环境的其余部分(使用-E选项):
sudo -E env "PATH=$PATH" <command> [arguments]
事实上,我们可以用它来做一个别名:
alias mysudo='sudo -E env "PATH=$PATH"'
(也可以将别名本身命名为sudo,取代原来的sudo。)
检查sudo上的secure_path
[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
如果$PATH正在被覆盖,使用visudo并编辑/etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
sudo
command not found
输入sudo,按“Enter”,查看是否安装了sudo软件包。如果你安装了sudo,系统将显示一个简短的帮助消息,否则你将看到类似sudo: command not found的东西
安装sudo时,以root帐号执行如下命令:
如果您的系统基于apt包管理器
如果您的系统基于yum包管理器