ssh 脚本返回 255 错误

Posted

技术标签:

【中文标题】ssh 脚本返回 255 错误【英文标题】:ssh script returns 255 error 【发布时间】:2013-01-30 21:35:23 【问题描述】:

在我的代码中,我有以下内容可以运行远程脚本。

ssh root@host.domain.com "sh /home/user/backup_mysql.sh"

出于某种原因,它一直在我身上 255'ing。有什么想法吗?

我可以通过 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

【问题讨论】:

由于某种原因,您的 remote 脚本返回 255,而 ssh 只是将其结果传递给您。给我们看看剧本怎么样? 作为警告,不要使用垃圾编辑将您的问题排在队列的前面。如果你再这样做,我会锁定这个问题。 在将客户端移动到另一台机器时,我经常忘记的一件事是您第一次执行此操作时会要求您验证指纹,因此如果您不以交互方式执行此操作,它会失败,直到您设法为同一帐户手动回答该问题。 我发现了类似的问题,所以如果它可以帮助其他人......我可以在命令行上 ssh,但不能从脚本运行。问题是当我登录到我正在执行 ssh 的机器 时我打开了代理转发,所以我的证书有问题(这是我没有获得正确的权限)没有出现,因为它使用了我的转发密钥。我必须关闭代理转发才能看到脚本可能也收到但未在输出中捕获的错误消息。 【参考方案1】:

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

【讨论】:

【参考方案2】:

这通常发生在遥控器关闭/不可用时;或者远程机器没有安装 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: connect to host HOSTNAME port 22: Connection refused

检查清单:

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

你能ping那台机器吗?

遥控器是否安装了ssh?

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

【讨论】:

然后是你在远程主机上运行的脚本返回 255。 很难确定为什么您的脚本返回 255。很可能是函数 backup_mysql_rsnapshot 有失败部分,因为其他两个函数在失败时返回 999。您可以 ssh 到那台机器并测试脚本吗?您可以在脚本中使用set -e 进行调试。 脚本在本地运行良好。不知道为什么它会远程中断。 ;/ 可能,您可以检查您在该函数中运行的每个命令的返回码,并为每个失败返回唯一的返回码,以便您识别哪个命令失败。 例如$MYSQLDUMP --single-transaction -u $MUSER -h $MHOST -p$MPASS $db || exit 101【参考方案3】:

当您对“known_hosts”文件中未包含的主机使用 pdsh 时,也会发生此错误。

我能够通过手动通过 SSH 连接到每个主机并接受“你想将它添加到已知主机”的问题来纠正这个问题。

【讨论】:

-x "-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" 也为我工作【参考方案4】:

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

 pssh -x '-tt' -h HOSTFILELIST -P "sudo yum -y install glibc"

-P 表示随心所欲地写出输出,并且是可选的。但是 -x '-tt' 技巧是强制分配伪 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 技巧here。另请注意,在这些情况下打开详细模式 (pssh --verbose) 对您没有任何帮助。

【讨论】:

【参考方案5】:

如果以上没有帮助:检查区域设置在客户端和服务器上是否有效:https://www.linuxbabe.com/linux-server/fix-ssh-locale-environment-variable-errorHow do not pass locale through ssh

【讨论】:

【参考方案6】:

这很可能是 ssh-agent 问题。 检查当前是否有 ssh-agent PID 与 eval "$(ssh-agent -s)" 运行

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

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

【讨论】:

【参考方案7】:

问题不在于行吗:

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

如果我错了,请纠正我,但我认为退出 999 超出了退出代码的范围,导致退出状态为 255。

【讨论】:

这是一个被低估的答案。

以上是关于ssh 脚本返回 255 错误的主要内容,如果未能解决你的问题,请参考以下文章

脚本 @php artisan package:discover 处理返回的 post-autoload-dump 事件,错误代码为 255

工匠清除编译返回错误代码255

Shell命令的退出状态及错误检查

shell脚本中如何设置exit值

bash 脚本中的 ssh“端口 22:没有到主机的路由”错误

python ssh弱口令爆破多线程脚本及遇到的一些错误与问题