通过ssh发送给主机的命令的返回状态

时间:2014-10-13 15:57:42

标签: linux bash shell

我有一个在机器上打开核心的脚本 它工作正常,但如果我增强它,就像没有核心 在机器上,我想告诉我,不只是踢出一个 错误命令。我想用某些东西替换错误 所以我试图找出最后一个命令的退出状态并以此为基础 如果声明的话。

#!/bin/bash
rc=$?
for i in server5432foo server5438foo server5344foo server5430foo;
do
echo $i ;
ssh -q -T $i " ls -ltr  /local/data/log/core*; echo $? ";
echo $rc

if [[ $rc == 0 ]] ; then
    ssh -q -T $i " chmod ugo+rw  /local/data/log/core* ";
    else
    echo " No core files on $i /local/data/log/ "
    fi
done

这是脚本返回的地方 指定文件中的核心。即使ls不成功,它仍然存在 返回0并且不运行else命令。

ls: cannot access /local/data/log/core*: No such file or directory
0
0
chmod: cannot access `/local/data/log/core*': No such file or directory

我正在尝试将commnand上的返回码发送到该盒子vias ssh。 在脚本中,似乎SSH成功​​,因此它返回零。 但是当我从shell运行命令时 - 如果不成功,我会得到一个非零的返回码。

casper@server0170foo:~/walt/restart_superprocesss$ ssh -q -T server5432foo "ls -ltr   /local/data/log/core00001" ; echo $?
ls: cannot access /local/data/log/core00001: No such file or directory
2
casper@server0170foo:~/walt/restart_superprocesss$ ssh -q -T server5432foo "touch    /local/data/log/core00001" ; echo $?
0
casper@server0170foo:~/walt/restart_superprocesss$ ssh -q -T server5432foo "ls -ltr    /local/data/log/core00001" ; echo $?
-rw-r--r-- 1 casper casper 0 Oct 13 11:38 /local/data/log/core00001
0

为什么返回代码与我直接从命令行运行命令时有所不同,这些命令准确相反 从脚本运行命令 - 我每次都得到0

2 个答案:

答案 0 :(得分:1)

我会尝试以下方法:

for i in server5432foo server5438foo server5344foo server5430foo; do
    echo $i;

    if ssh -q -T $i " ls -ltr /local/data/log/core* > /dev/null; then
        ssh -q -T $i "chmod ugo+rw  /local/data/log/core*"
    else
        echo "No core files on $i /local/data/log/"
    fi
done

答案 1 :(得分:1)

如果你想检查ssh的返回状态(应该是远程执行命令的返回状态或更高的数字表示ssh本身失败),我认为你的错误脚本,并且您希望删除ssh语句中的echo,因为它将以0退出(并且因为使用双引号,$?将是ssh之前的命令的返回值。 1}},而不是ls)的返回值:

#!/bin/bash
# This line isn't really helpful
#rc=$?
for i in server5432foo server5438foo server5344foo server5430foo;
do
echo $i ;
ssh -q -T $i "ls -ltr /local/data/log/core*";
# This is the new line to make sure $rc has the ssh exit status
rc=$?
echo $rc

if [[ $rc == 0 ]] ; then
    ssh -q -T $i "chmod ugo+rw  /local/data/log/core*";
    else
    echo " No core files on $i /local/data/log/ "
    fi
done

从手册页:

  

退出状态        ssh以远程命令的退出状态退出,如果发生错误则退出255.