好吧,如果主题不清楚,我会解释我的疑问。我在本地用户处保存了一个名为 (executeAdM.sh) 的 shell 脚本,当我执行此脚本时,我会通过从指令文件中获取命令来连接到 SUDO 用户。但是当我执行此脚本时,我还将参数传递给此脚本,该参数实际上是 SUDO 用户的某个目录路径。请参阅下面的脚本:
本地脚本(executeADM.sh)-:
#!/bin/bash
echo password | sudo -S -l
sudo /usr/bin/su - user <<\EOF
#ls -lrt
pwd
for entry in $(ls -r)
do
if [ "$entry" = "testingADM.sh" ];then
./$entry $1
fi
done
EOF
执行上述操作如下:
./executeADM.sh somePath
当上述脚本执行时,它会成功连接到另一个用户,并且在 SUDO 用户处,我执行一个 for 循环,搜索另一个名为 testingADM.sh 的脚本。找到脚本后,我会使用从本地用户传递的参数执行该脚本,testingADM.sh 应该为我设置该路径,但它不起作用,它没有读取从本地用户传递的参数。有人能帮我吗,我不知道如何解决这个问题。如果有什么不清楚的地方,请问我,基本上我想将参数从本地 shell 脚本传递给 SUDO USER shell 脚本:
SUDO 用户脚本(testingADM.sh)-:
#!/bin/bash
path=$1
cd $path
pwd
如果我将脚本中的路径变量值硬编码到 SUDO 中,一切正常。但我不想这样。:
#!/bin/bash
path=somepath
cd $path
pwd
答案1
你遇到的问题比你想象的还要多。首先,你可以毫无问题地将参数传递给 sudo 脚本:
[me@nagios ~]$ cat parent.sh
#!/bin/bash
echo parent has $1 $2
sudo ./child.sh $1 $2
[me@nagios ~]$ cat child.sh
#!/bin/bash
echo child has $1 $2
[me@nagios ~]$ ./parent.sh a1 b2 c3
parent has a1 b2
child has a1 b2
你的问题在于你使用的是这里的文件(<<EOF
),这不是一种允许以简单方式传递参数的机制:重写以让一个脚本调用另一个脚本,这样就没问题了。
你还循环输出ls
,如下所示很多人都注意到了这里是个糟糕的想法,只要你得到一个足够不寻常的文件名,它就会失效。在调用之前,只需测试是否存在(或者更好的是,使用 测试可执行文件是否存在[ -x
) 。testingADM.sh
基本上,你已经为自己写了一个XY问题:一旦你停止尝试以错误的方式做事,你的许多问题就会消失。