从 Linux 运行存储在 Windows 共享上的 Bash 脚本

从 Linux 运行存储在 Windows 共享上的 Bash 脚本

我想直接从 Windows 共享运行脚本。Windows 计算机运行的是 Windows 7,我尝试从同一 LAN 上的 Ubuntu 13.10 运行该脚本。我尝试使用 bash 脚本和 python 脚本,运行时出现以下错误:

zsh: permission denied: ./bc.sh

包含脚本的共享安装如下:

sudo mount -t cifs -o username=user,passwordpass=,exec,rw,users,file_mode=0777,dir_mode=0777 //192.168.0.3/folder /mnt/Win7

该脚本拥有以下权利:

-rwxrwxrwx 0 root root       24 Dec 10 20:50 bc.sh

并且仅包含一个简单的命令:

#!/bin/bash
echo "Test"

我尝试使用 sudo 运行它,但效果不佳。

sudo: unable to execute ./bc.sh: Permission denied

我也尝试用 bash 代替 zsh,但没有成功。

知道我错过了什么吗?

谢谢。

答案1

你必须执行脚本

       sh path/to/bc.sh

答案2

据我所知,有三个可能的原因导致脚本在直接调用时无法运行。

  1. 电子Xecute 位尚未设置。

    [liveuser@localhost-live ~]$ ls -l ~/*.sh
    -rw-rw-rw-. 1 liveuser liveuser 28 Mar 25 07:55 /home/liveuser/testnox.sh
    -rwxrwxrwx. 1 liveuser liveuser 28 Mar 25 07:23 /home/liveuser/test.sh
    [liveuser@localhost-live ~]$ ~/test.sh
    Hello world.
    [liveuser@localhost-live ~]$ ~/testnox.sh
    bash: /home/liveuser/testnox.sh: Permission denied
    [liveuser@localhost-live ~]$ sh ~/testnox.sh
    Hello world.
    

    sh请注意,只要您有读取权限,您仍然可以通过直接调用来运行它。另外,检查 x 位是否适用于您。如果该文件归 root 所有并且显示为,-rwx------.那么您必须使用sudo来运行它。

  2. 适用 SELinux 规则,阻止您执行该文件。我对此不太了解,但在这种情况下,事先使用会有所帮助。完成后sudo setenforce 0别忘了使用。sudo setenforce 1

    [liveuser@localhost-live ~]$ sestatus
    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             targeted
    Current mode:                   enforcing
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      30
    [liveuser@localhost-live ~]$ sudo setenforce 0
    [liveuser@localhost-live ~]$ sestatus
    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             targeted
    Current mode:                   permissive
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      30
    [liveuser@localhost-live ~]$ sudo setenforce 1
    [liveuser@localhost-live ~]$ sestatus
    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             targeted
    Current mode:                   enforcing
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      30
    
  3. 脚本所在的树是使用 挂载的,这在许多情况下是默认的。请注意,重要noexec的是(no)execmount --bind有时既不复制挂载点的父卷的状态,也不复制原始卷的状态。

    [liveuser@localhost-live ~]$ ls -l original
    total 4
    -rwxrwxr-x. 1 liveuser liveuser 28 Mar 25 08:14 test.sh
    [liveuser@localhost-live ~]$ ls -l alias
    total 4
    -rwxrwxr-x. 1 liveuser liveuser 28 Mar 25 08:14 test.sh
    [liveuser@localhost-live ~]$ original/test.sh
    Hello world.
    [liveuser@localhost-live ~]$ alias/test.sh
    bash: alias/test.sh: Permission denied
    [liveuser@localhost-live ~]$ sh alias/test.sh
    Hello world.
    [liveuser@localhost-live ~]$ sudo mount -o remount,exec --bind original alias
    [liveuser@localhost-live ~]$ alias/test.sh
    Hello world.
    

Linux 令人沮丧的原因之一是错误消息并没有真正为您提供解决问题所需的详细信息。Permission denied在我看来,这还不够。它应该说明实际原因是什么,例如:Permission denied: /home/liveuser/alias was mounted with noexec。然后您就会知道如何解决问题。

好吧,无论如何我希望这会有所帮助。

相关内容