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


27

我很沮丧 我的/home目录中有一个可执行的脚本:

[user@server ~]$ ll
total 4
-rwx------ 1 user user 2608 Jul 15 18:23 qa.sh

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

[user@server ~]$ sudo ./qa.sh 
[sudo] password for user: 
sudo: unable to execute ./qa.sh: No such file or directory

这是一个全新的版本。没有进行会导致问题的更改。实际上,脚本的目的是确保它实际上是根据我们的政策构建的。也许不是,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

3
尝试使用sh qa.sh代替./qa.sh
Networker

@Networker使用此格式时,行为无变化。
theillien

Answers:


28

#!脚本中的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

bad interpreter消息清楚地表明是Shebang出了问题。


11
这就是问题所在。有隐藏的^M字符,口译员在shebang行中读它。我运行了它,dos2unix并立即将其修复。谢谢
〜– theillien

1
您正在使用什么编辑器?
ctrl-alt-delor 2014年

5
在我的情况下,行尾设置错误,对于Windows为CR-LF,对于Linux应该为LF。可能需要一段时间才能找到答案。
RolfBly 2014年

11

我只是遇到了这个确切的问题,原来是文本文件编码问题。我需要在运行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

尽管这样做确实可行,但要认识到行尾字符的解释是由文件上的shebang决定的。因此,这可以解决问题,但也可以更改shebang。
ErikE

我在Windows上的Atom编辑器遇到了这个问题。默认行尾为CRLF。但是,如果转到设置>包>行尾选择器,则可以将默认行尾更改为LF。然后,当您在Linux上运行bash脚本WinSCP时,它应该执行而不会产生误导性No such file or directory错误。
斯纳克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.