![当脚本驻留在 SSHFS 挂载上时,如何使用 sudo 执行脚本?](https://linux22.com/image/199940/%E5%BD%93%E8%84%9A%E6%9C%AC%E9%A9%BB%E7%95%99%E5%9C%A8%20SSHFS%20%E6%8C%82%E8%BD%BD%E4%B8%8A%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20sudo%20%E6%89%A7%E8%A1%8C%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我不是在询问有关挂载 SSHFS 挂载点的问题,这是我发现的所有类似问题的主题。
我的安装点 ( /path/to/sshfs/mount/
) 已正确安装,我可以作为我的用户列出、读取、写入所有预期的文件。
我确实有权将脚本复制到本地目录。但是,由于该脚本需要多个包含库文件和资源的子目录,因此我更喜欢在其所在位置执行脚本,而不是将其复制到本地。而且,它不需要复制到本地计算机以完成其预期工作。
不幸的是,对于 SSHFS 挂载,该脚本需要 root 权限才能执行许多操作,因为它必须将一些文件安装到系统目录并更新系统中存在的不同用户的文件。
这是我的错误:
$ cd /path/to/sshfs/mount/
$ sudo ./myscript.sh
sudo: unable to execute ./myscript.sh: Permission denied
以下是我执行的检查:
$ ls -la
-rwxr-x--- 1 myuser team 8173 Dec 15 06:33 myscript.sh
$ sudo -i
[sudo] password for myuser:
#
$ cat /etc/fstab
myuser@myserver:/path/to/sshfs/mount/ /path/to/sshfs/mount/ fuse.sshfs x-systemd.automount,_netdev,user,follow_symlinks,identityfile=/path/to/.ssh/key_file,allow_other,default_permissions 0 2
这表明所需的fuse.conf选项已启用:
$ cat /etc/fuse.conf
user_allow_other
什么样的 SSHFS 配置允许我运行:
$ sudo /path/to/sshfs/mount/myscript.sh
答案1
mount 命令支持exec
以下noexec
挂载选项:
exec:允许执行二进制文件。
noexec:不允许在已安装的文件系统上直接执行任何二进制文件。
即使您没有指定任何一个安装选项,noexec
如果您指定了安装选项,也会应用该安装选项users
。
- users:允许任何用户挂载和卸载文件系统,即使其他普通用户挂载了它。
users 选项意味着 noexec、nosuid 和 nodev 选项(除非被后续选项覆盖,如选项行 users,exec,dev,suid 中)。
此命令显示正在noexec
隐式应用:
findmnt /path/to/sshfs/mount
myuser@myserver:/path/to/sshfs/mount/ fuse.sshfs rw,nosuid,nodev,noexec,relatime,user_id=0,group_id=0,default_permissions,allow_other
因此,解决这个问题的办法很简单,就是添加exec
mount选项。
答案2
我怀疑您对权限有些困惑。
您的 sshfs 访问权限只能以验证 ssh 会话的用户身份访问文件。虽然,正如 MountainX 所说,文件系统可能挂载为 noexec,但解决起来很简单:
$ sudo bash myscript.sh
但是,请注意,虽然该脚本将以 root 身份在本地计算机上以 root 权限执行,但它仅具有远程文件系统上 ssh 身份验证用户的权限。进一步的 shell 脚本通常只是将其他命令串在一起 - 其中一些可能是正确映射到 sshfs 挂载点的相对路径。其他人可能会指出其他地方;这看起来像是一场即将发生的事故。