0

我目前正在编写一个正在编写脚本然后执行它们的脚本。

运行父脚本的用户是 root 用户。

这是代码:

1    for i in $(seq 1 $num)
2    do
3
4
5        scriptL1="#!/bin/bash"
6        scriptL2="i=$i"
7        echo $scriptL1 > /tmp/pulse$i.sh
8        echo $scriptL2 >> /tmp/pulse$i.sh
9
10       #this loop writes line-by-line from a file to the child script file
11       for j in $(seq 1 $(cat $HOME/mainscript.txt | wc -l))
12       do
13           line=$(head -n $j $HOME/mainscript.txt | tail -n 1)
14           echo $line >> /tmp/pulse$i.sh
15       done
16
17       chmod +x /tmp/pulse$i.sh
18
19       setsid /tmp/pulse$i.sh &
20   done

它本质上是为目录中的 $num 个项目做的,它在 /tmp 中生成 $num 个脚本。从此脚本在 /tmp 中创建的每个脚本都按预期工作。事实上,这个整体脚本有效。但是,当我从终端运行此父脚本时,它无法启动任何 /tmp/pulseVM$i.sh 可执行文件。

简而言之,这个脚本未能按预期执行第 19 行,我不知道为什么。

我期待这个父脚本会将这些子脚本分叉到后台。这样,这个父脚本可以在子脚本继续的同时结束。目前,没有执行子脚本。

这是一个示例 mainscript.txt:

WORK="#Write a directory path here"

#This directory is owned by root and must be owned by the root. It is also shared with a virtual machine that is using root.
rm $WORK/VMInputShared/VM$i/pong/pulse

touch $WORK/VMInputShared/VM$i/ready

sleep 10

fails=0
while true
do
    if [[ $(ls $WORK/VMInputShared/VM$i/pong) == "pulse" ]]
    then
        touch $WORK/VMReadyKeys/VM$i
        fails=0
        mv $WORK/VMInputShared/VM$i/pong/pulse $WORK/VMInputShared/VM$i/ping/pulse
    else
        ((fails++))
            if [ $fails -le 9 ]
            then
                echo "Failure $fails/10..."
            else
                echo "Failure $fails/10..."
                rm $WORK/VMReadyKeys/VM$i
            fi
    fi
    sleep 3.2
done

请务必注意,.../VM$i 是一个共享文件夹,其中包含在该系统上运行的虚拟机。虚拟机在 root 下运行,由于虚拟机的用途,它始终需要 root 权限。

4

1 回答 1

0

我非常有信心我已经找到了它为什么不起作用。这个父脚本是为 root 用户制作的,但是当我在一个默认情况下没有 root 权限的帐户下进行测试时,我尝试使用 sudo 作为一种以超级用户权限测试这个脚本的方法,但这不起作用。它只有在我通过登录 su 成为 root 后才开始工作。

我相信这源于子脚本“/tmp/pulse$i.sh”的内容。此脚本使用需要超级用户权限的命令。我相信当我在父脚本上使用 sudo 时,当子脚本被设置到后台时,它并没有保留父脚本拥有的 sudo 的这些超级用户权限。我相信这就是使 setid 看起来失败的原因,而实际上它正在运行脚本但由于需要超级用户的许可而立即失败。

这很令人困惑,因为当我测试父脚本时,我不会从终端得到任何提示,告诉我有什么问题。

最后,如果子脚本需要超级用户权限,那么在以超级用户身份通过​​ su 登录时运行父脚本可以解决此问题。如果它将以超级用户身份运行,请尝试以超级用户身份运行(而不是 sudo)。

于 2021-12-17T03:03:56.470 回答