Linux ssh脚本返回255个错误

Linux ssh脚本返回255个错误,linux,bash,shell,ssh,Linux,Bash,Shell,Ssh,在我的代码中,我有以下命令来运行远程脚本 ssh root@host.domain.com "sh /home/user/backup_mysql.sh" 不知什么原因,它一直困扰着我。有什么想法吗 我可以很好地SSH到这个框中(无密码密钥设置) 远程脚本: MUSER='root' MPASS='123123' MHOST="127.0.0.1" VERBOSE=0 ### Set bins path ### GZIP=/bin/gzip MYSQL=/usr/bin/mysql MYS

在我的代码中,我有以下命令来运行远程脚本

ssh root@host.domain.com "sh /home/user/backup_mysql.sh"
不知什么原因,它一直困扰着我。有什么想法吗

我可以很好地SSH到这个框中(无密码密钥设置)

远程脚本:

MUSER='root' 
MPASS='123123'
MHOST="127.0.0.1"
VERBOSE=0

### Set bins path ###
GZIP=/bin/gzip
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
RM=/bin/rm
MKDIR=/bin/mkdir
MYSQLADMIN=/usr/bin/mysqladmin
GREP=/bin/grep

### Setup dump directory ###
BAKRSNROOT=/.snapshots/tmp

#####################################
### ----[ No Editing below ]------###
#####################################
### Default time format ###
TIME_FORMAT='%H_%M_%S%P'

### Make a backup ###
backup_mysql_rsnapshot(){
        local DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
        local db="";
        [ ! -d $BAKRSNROOT ] && ${MKDIR} -p $BAKRSNROOT
        ${RM} -f $BAKRSNROOT/* >/dev/null 2>&1
#       [ $VERBOSE -eq 1 ] && echo "*** Dumping MySQL Database ***"
#       [ $VERBOSE -eq 1 ] && echo -n "Database> "
        for db in $DBS
        do
                local tTime=$(date +"${TIME_FORMAT}")
                local FILE="${BAKRSNROOT}/${db}.${tTime}.gz"
#               [ $VERBOSE -eq 1 ] && echo -n "$db.."
                ${MYSQLDUMP} --single-transaction -u ${MUSER} -h ${MHOST} -p${MPASS} $db | ${GZIP} -9 > $FILE
        done
#               [ $VERBOSE -eq 1 ] && echo ""
#               [ $VERBOSE -eq 1 ] && echo "*** Backup done [ files wrote to $BAKRSNROOT] ***"
}

### Die on demand with message ###
die(){
        echo "$@"
        exit 999
}

### Make sure bins exists.. else die
verify_bins(){
        [ ! -x $GZIP ] && die "File $GZIP does not exists. Make sure correct path is set in $0."
        [ ! -x $MYSQL ] && die "File $MYSQL does not exists. Make sure correct path is set in $0."
        [ ! -x $MYSQLDUMP ] && die "File $MYSQLDUMP does not exists. Make sure correct path is set in $0."
        [ ! -x $RM ] && die "File $RM does not exists. Make sure correct path is set in $0."
        [ ! -x $MKDIR ] && die "File $MKDIR does not exists. Make sure correct path is set in $0."
        [ ! -x $MYSQLADMIN ] && die "File $MYSQLADMIN does not exists. Make sure correct path is set in $0."
        [ ! -x $GREP ] && die "File $GREP does not exists. Make sure correct path is set in $0."
}

### Make sure we can connect to server ... else die
verify_mysql_connection(){
        $MYSQLADMIN  -u $MUSER -h $MHOST -p$MPASS ping | $GREP 'alive'>/dev/null
        [ $? -eq 0 ] || die "Error: Cannot connect to MySQL Server. Make sure username and password are set correctly in $0"
}

### main ####
verify_bins
verify_mysql_connection
backup_mysql_rsnapshot

如果身份验证或连接出现问题,例如无法从终端读取密码,ssh将以255退出,而无法运行实际脚本。验证以确保可以改为运行“true”,以查看ssh连接是否成功建立。

这通常发生在远程设备关闭/不可用时;或者远程机器没有安装ssh;或者防火墙不允许建立到远程主机的连接

ssh
在发生错误或远程脚本返回255时返回255:

 EXIT STATUS

     ssh exits with the exit status of the remote command or
     with 255 if an error occurred.
通常,您会收到类似以下内容的错误消息:

ssh: connect to host host.domain.com port 22: No route to host

检查表:

  • 如果直接从命令行运行ssh命令,会发生什么

  • 你能
    ping
    那台机器吗

  • 远程服务器是否安装了ssh

  • 如果已安装,那么ssh服务是否正在运行


将pdsh用于“已知主机”文件中未包含的主机时,也会发生此错误


我可以通过手动将SSH连接到每个主机并接受问题“是否要将其添加到已知主机”来纠正这一问题。

我被这个问题难住了。一旦我通过了255题。。。我最终得到了一个神秘的错误代码1。这是解决该问题的foo:

 pssh -x '-tt' -h HOSTFILELIST -P "sudo yum -y install glibc"
-p表示在运行时写出输出,是可选的。但是-x'-tt'技巧是强制分配psuedo tty的

如果您尝试以下操作,可以了解错误代码1的含义:

ssh AHOST "sudo yum -y install glibc"
你可以看到:

[slc@bastion-ci ~]$ ssh MYHOST "sudo yum -y install glibc"
sudo: sorry, you must have a tty to run sudo
[slc@bastion-ci ~]$ echo $?
1
请注意,它的返回代码是1,这是pssh向您报告的内容


我发现了这个-x-tt技巧。还要注意,为这些情况启用详细模式(pssh--verbose)对您没有任何帮助

正如@wes floyd和@zpon所写,将这些参数添加到SSH以绕过“您确定要继续连接(是/否)”吗


如果上面没有帮助:检查区域设置在客户端和服务器上是否有效:


这很可能是ssh代理的问题。 检查当前是否有使用
eval“$(ssh代理-s)”运行的ssh代理PID

检查您的身份是否添加了
ssh add-l
,如果没有,请添加
ssh add


然后重试返回255的ssh命令(或生成ssh守护进程的任何其他命令,例如autossh)。

出于某种原因,远程脚本返回255,ssh只向您发送其结果。给我们看一下脚本怎么样?作为警告,不要使用垃圾编辑来不断地将问题推到队列前面。如果您再次这样做,我将锁定此问题。在将客户端移动到另一台计算机时,我经常忘记的一件事是您第一次这样做时,它会要求您验证指纹,因此,如果您不是以交互方式这样做,则在您设法为同一帐户手动回答该问题之前,它将失败。我发现了类似的问题,所以如果它能帮助其他人。。。我可以在命令行上使用ssh,但在从脚本运行时不能。问题是,当我登录到执行ssh的机器时,代理转发已打开,因此我的证书(即我没有获得正确的权限)没有出现问题,因为它使用了我的转发密钥。我必须关闭代理转发以查看错误消息,该脚本可能也在获取,但未在输出中捕获。然后是在远程主机上运行的脚本返回255。很难确定脚本返回255的原因。最有可能的是函数
backup\u mysql\u rsnapshot
出现故障,因为其他两个函数在出现故障时返回999。您可以使用ssh连接到该机器并测试脚本吗?您可以在脚本中使用
set-e
对其进行调试。脚本在本地运行良好。不知道为什么它会远程断开/可能是,您可以检查在该函数中运行的每个命令的返回代码,并为每个失败返回唯一的返回代码,以便确定哪个命令失败“-o UserKnownHostsFile=/dev/null-o StrictHostKeyChecking=no”对我也有用
[slc@bastion-ci ~]$ ssh MYHOST "sudo yum -y install glibc"
sudo: sorry, you must have a tty to run sudo
[slc@bastion-ci ~]$ echo $?
1
-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no