gpt4 book ai didi

linux - 将源代码与包含 sudo 命令的脚本一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:50 29 4
gpt4 key购买 nike

我有一个在服务器之间复制文件的脚本。我正在使用 lsof 命令来确保文件在移动之前没有被写入。运行脚本的用户和写入文件的用户不同,所以我需要对文件所有者进行 sudo。这是 sudoers 文件中的相关行:

userA ALL=(userB:userB) NOPASSWD: ALL

在主脚本中(以 userA 身份运行),我尝试调用 sudo 然后调用包含 lsof 命令的下标:

sudo su - userB -c 'source ./getOpenFiles.sh'

getOpenFiles.sh 有这一行:

#!/bin/bash 
lsofResult=$(/usr/sbin/lsof "${sourcePath}")

我也试过调用下标:

source ./getOpenFiles.sh

然后下标的第一行是sudo:

#!/bin/bash
sudo su - banjobs
lsofResult=$(/usr/sbin/lsof "${sourcePath}")`.

两种解决方案均无效。

最佳答案

你真正想要的是:

lsofResult=$(sudo -u banjobs lsof "${sourcePath}")

让我们回顾一下为什么其他方法一次一个都行不通:

  • 正在运行 sourcesudo su -c

    sudo su - userB -c 'source ./getOpenFiles.sh'

    ...使用sudo运行 su ,它运行 sh -c 'source ./getOpenFiles.sh' .由于几个独立的原因,这不起作用:

    1. sh -c 'source ./getOpenFiles.sh'依赖于 source关键字在 /bin/sh 中可用,但这是一个 bash 扩展。

    2. 即使您的 /bin/sh由 bash 提供,这仍然违背了使用 source 的目的: 通过启动 /bin/sh 的新副本并将您的脚本采购到其中,您是在新 shell 中定义变量,而不是在 启动 sudo su 的原始 shell 中定义变量

  • 正在运行 sudo su - banjobs , 其次是 lsofResult=$(/usr/sbin/lsof "${sourcePath}")

    ...意味着lsofResult=$(...)直到 sudo su - banjobs 之后才运行导出。如果sudo su - banjobs已经退出,则当前用户不是banjobs更多,所以 sudo命令对 lsof 没有任何影响.


详细演示如何测试这个(对于那些在他们的系统上没有 banoffuserB 帐户的人):

# place relevant contents in sourceme.bash
# switching from lsof to fuser for this test since OS X lsof does not accept a directory
# as an argument.
cat >sourceme.bash <<'EOF'
lsofResult=$(sudo -u root fuser "${sourcePath}" 2>&1)
EOF

# set sourcePath in the outer shell
sourcePath=$PWD
source sourceme.bash
declare -p lsofResult

...在我的系统上,输出类似于以下内容:

declare -- lsofResult="/Users/chaduffy/tmp: 17165c 17686c 17687c 17688c 17689c 17690c"

...显示有问题的代码确实按照描述的那样工作。

关于linux - 将源代码与包含 sudo 命令的脚本一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41251232/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com