如果循环无法正常工作,则调用远程服务器脚本和命令时权限被拒绝

如果循环无法正常工作,则调用远程服务器脚本和命令时权限被拒绝

我们有两台服务器,一台是aix,另一台是linux,所以从我们的linux服务器上,我试图调用位于aix上的脚本以最小化脚本执行时间。代码:在linux机器上

ssh user@$ip "sudo -u user2 'bash -c .  /path (loading user profile) ; sh script.sh' "

在 Aix 机器上:

脚本文件

#/bin/bash
. /path [loading user profile]

db2 connect to db_name

db2 list tablespaces | grep -i state | wc -l  > state_log

db2 list tablespaces | grep -i state | wc -l  > normal_log



var1=$(cat state_log)

var2=$(cat normal_log)

if [[ "${var1}" == "${var2}" ]]
then
echo " tablespaces are normal "
else
echo "tablespaces are not normal"
fi

脚本在 aix 机器上运行正常,但是在 linux 机器上出现错误

cat: cannot open state log and normal log : permission denied( even after giving
Full permission to file)

----++++新变化++++++

根据您在评论部分的建议,我做了一些更改。

现在,在 Linux 机器上,我使用下面的代码来调用远程服务器上的脚本。

ssh user@$ip 'sudo -u user2 bash script.sh' 

在 Aix 机器上:

script.sh

#/bin/bash 
. /path [user profile]
 if [[ `db2 connect to db_name |  db2 list tablespaces | grep -i state | wc -l` == `db2 connect to db_name` | db2 list tablespaces | grep -i state | wc -l` ]]
then 
echo " tablespaces are normal " 
else 
echo "tablespaces are not normal" 
fi 

脚本现在在 aix 机器上无法正常工作,有时它会在 if 循环中获取第一个命令的值,有时会获取第二个命令的值。我不明白代码有什么问题。预先感谢您的所有帮助!

+++++++新变化2 +++++++

我对 aix 脚本进行了以下更改,它对我有用。

#/bin/bash . /path [加载用户配置文件]

db2 连接到 db_name

db2 列表表空间 | grep -i 状态 | wc -l > 文件 1 的完整路径

db2 列表表空间 | grep -i 状态 | wc -l > 文件2的完整路径

var1=$(cat full_path_of_file1)

var2=$(cat file2 的完整路径)

if [[ "${var1}" == "${var2}" ]] then echo "表空间正常" else echo "表空间不正常" fi

AIX 操作系统的行为有点奇怪,但它确实有效。

答案1

代替

ssh user@$ip "sudo -u user2 'bash -c .  /path (loading user profile) ; sh script.sh' "

ssh user@$ip sudo -u user2 bash script.sh

您不需要./path在脚本外部调用,因为脚本首先执行的是调用它本身。到那时,这条线就可以大大简化。

如果这不能解决权限错误,请确保您位于脚本的正确目录中

ssh user@$ip sudo -Hu user2 bash script.sh

更好的防御性编码是在脚本中使用文件的目录路径state_log,并normal_log显式设置写入它们的必要目录。

如果您显示了完整的脚本,您甚至可以通过不写入文件而是直接将输出捕获db2到两个变量中来进一步优化它:

#/bin/bash
. /path    # Load user profile

db2 connect to db_name
var1=$(db2 list tablespaces | grep -i state | wc -l)
var2=$(db2 list tablespaces | grep -i state | wc -l)

if [[ $var1 -eq $var2 ]]
then
    echo "tablespaces are normal"
else
    echo "tablespaces are not normal"
fi

尽管我不完全确定为什么$var并且$var2在这种情况下会有所不同。

相关内容