![如果循环无法正常工作,则调用远程服务器脚本和命令时权限被拒绝](https://linux22.com/image/212141/%E5%A6%82%E6%9E%9C%E5%BE%AA%E7%8E%AF%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C%EF%BC%8C%E5%88%99%E8%B0%83%E7%94%A8%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%84%9A%E6%9C%AC%E5%92%8C%E5%91%BD%E4%BB%A4%E6%97%B6%E6%9D%83%E9%99%90%E8%A2%AB%E6%8B%92%E7%BB%9D.png)
我们有两台服务器,一台是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
在这种情况下会有所不同。