57

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

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
4

7 回答 7

43

这通常发生在遥控器关闭/不可用时;或者远程机器没有安装 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 服务是否正在运行?

于 2013-02-14T23:30:28.763 回答
13

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

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

于 2014-07-11T01:59:05.130 回答
7

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

于 2013-02-14T23:28:35.363 回答
3

我被这件事难住了。一旦我通过了 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 技巧。另请注意,在这些情况下打开详细模式 (pssh --verbose) 对您没有任何帮助。

于 2016-03-18T21:59:42.677 回答
2

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

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

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

于 2019-12-23T10:54:29.993 回答
2

问题不在于:

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

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

于 2021-11-03T21:01:07.037 回答
0

如果以上没有帮助:检查客户端和服务器上的语言环境是否有效:
https ://www.linuxbabe.com/linux-server/fix-ssh-locale-environment-variable-error
如何不通过 ssh 传递语言环境

于 2019-09-29T23:22:28.913 回答