sudo: 无法执行 ./script.sh: 没有这样的文件或目录

the*_*ien 37 bash executable shell-script

我难住了。我的/home目录中有一个可执行的脚本:

[user@server ~]$ ll
total 4
-rwx------ 1 user user 2608 Jul 15 18:23 qa.sh
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试用sudo它运行它时说它找不到它:

[user@server ~]$ sudo ./qa.sh 
[sudo] password for user: 
sudo: unable to execute ./qa.sh: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这是一个全新的版本。没有进行任何会导致问题的更改。事实上,脚本的重点是确保它实际上是根据我们的策略构建的。也许它不是并且sudo实际上在构建过程中被破坏了?

我还应该注意,我可以sudo在其他目录中使用其他命令运行。

编辑:脚本(不是/bin/bash我写的,所以请不要把它写在我身上;))

#! /bin/bash

. /root/.bash_profile

customer=$1

if [ -z "$customer" ]; then

        echo "Customer not provided. Exiting..."
        exit 1

fi

space ()
{
echo
echo '###########################################################################'
echo '###########################################################################'
echo '###########################################################################'
echo
}

g=/bin/egrep

$g ^Listen /etc/ssh/sshd_config
$g ^PermitR /etc/ssh/sshd_config
$g ^LogL /etc/ssh/sshd_config
$g ^PubkeyA /etc/ssh/sshd_config
$g ^HostbasedA /etc/ssh/sshd_config
$g ^IgnoreR /etc/ssh/sshd_config
$g ^PermitE /etc/ssh/sshd_config
$g ^ClientA /etc/ssh/sshd_config

space

$g 'snyder|rsch|bream|shud|mweb|dam|kng|cdu|dpr|aro|pvya' /etc/passwd ; echo ; echo ; $g 'snyder|rsch|bream|shud|mweb|dam|kng|cdu|dpr|aro|pvya' /etc/shadow

space

$g 'dsu|scan' /etc/passwd ; echo ; echo ; $g 'dsu|scan' /etc/shadow

space

$g ${customer}admin /etc/passwd

space

chage -l ${customer}admin

space

$g 'urs|cust|dsu' /etc/sudoers

space

$g dsu /etc/security/access.conf

space

$g account /etc/pam.d/login

space

/sbin/ifconfig -a | $g addr | $g -v inet6

space

echo "10.153.156.0|10.153.174.160|10.120.80.0|10.152.80.0|10.153.193.0|172.18.1.0|10.153.173.0"
echo
$g '10.153.156.0|10.153.174.160|10.120.80.0|10.152.80.0|10.153.193.0|172.18.1.0|10.153.173.0' /etc/sysconfig/network-scripts/route-eth1

space

cat /etc/sysconfig/network-scripts/route-eth2

space

netstat -rn | tail -1

space

cat /etc/sysconfig/iptables

space

cat /etc/hosts

space

##file /usr/local/groundwork ; echo ; echo ; /sbin/service gdma status

##space

cat /etc/resolv.conf

space

HOSTNAME=`echo $HOSTNAME | awk -F. '{ print $1 }'`

nslookup ${HOSTNAME}

echo
echo

nslookup ${HOSTNAME}-mgt

echo
echo

nslookup ${HOSTNAME}-bkp

space

/sbin/service rhnsd status ; echo ; echo ; /sbin/chkconfig --list rhnsd ; echo ; echo ; yum update --security

space

/sbin/service osad status ; echo ; echo ; /sbin/chkconfig --list osad

space

/sbin/service sshd status ; echo ; echo ; /sbin/chkconfig --list sshd

space

/sbin/service snmpd status ; echo ; echo ; /sbin/chkconfig --list snmpd ; echo ; echo ; echo ; cat /etc/snmp/snmpd.conf

space

df -h

space

cat /proc/cpuinfo | $g ^processor

space

free -g

space

if [ -f /etc/rsyslog.conf ]; then

        tail -3 /etc/rsyslog.conf

else

        echo "This system is not running rsyslog."

fi

rm -f $0
Run Code Online (Sandbox Code Playgroud)

phe*_*mer 36

这通常发生#!在脚本中的 shebang ( ) 行损坏时。

shebang 告诉内核文件需要使用解释器执行。不带 运行时sudo,消息会更有意义一些。但随着sudo你得到你得到的消息。

例如:

$ cat test.sh
#!/bin/foo
echo bar

$ ./test.sh
bash: ./test.sh: /bin/foo: bad interpreter: No such file or directory

$ bash test.sh
bar

$ sudo ./test.sh
sudo: unable to execute ./test.sh: No such file or directory

$ sudo bash ./test.sh
bar
Run Code Online (Sandbox Code Playgroud)

bad interpreter消息清楚地表明是 shebang 有问题。

  • 这就是问题所在。有隐藏的 `^M` 字符,解释器将其作为 shebang 行的一部分阅读。我通过 `dos2unix` 运行它并且它修复了它。谢谢~ (16认同)
  • 就我而言,行尾设置错误,对于 Windows 为 CR-LF,对于 Linux 应该为 LF。在你发现之前可能需要一段时间。 (7认同)

小智 21

我刚刚遇到了这个确切的问题,结果证明是文本文件编码问题。为了在运行 Xubuntu 14.04.3 LTS 时修复它,我安装了 dos2unix 并转换了脚本的编码,然后使用 sudo 再次运行脚本,它运行良好。您可以在下面找到一个示例:

sudo apt-get install dos2unix -y
dos2unix test.sh
sudo chmod u+x test.sh && sudo ./test.sh
Run Code Online (Sandbox Code Playgroud)