几个常见的 ssh 问题

ssh broken pipe

ssh连接如果有一会儿不去操作,再试图去输入命令时会发现没有反应, 再过一会儿就会报错Write failed: broken pipe。

解决办法

这个问题可以通过设置ssh的keep alive来避免。

在 ~/.ssh/config中如下设置可以在让连接在30分钟不操作的情况下不断线。

#每隔60秒往服务器发送一次alive请求
ServerAliveInterval 60
#最多连续发送3次alive请求
#ServerAliveCountMax 3
# Tunnel设置实用选项
ExitOnForwardFailure yes

更新: 可以不用设置 ServerAliveCountMax, 该选项的含义是发送ServerAlive请求的尝试次数。 指的是每一次发生ServerAlive,如果失败了,会尝试几次;而不是总共发送多少次ServerAlive。 在设置了ServerAliveInterval以后,会一直在该间隔期的频率上发生ServerAlive请求。

选项 ExitOnForwardFailure 能帮助在tunnel异常的情况下退出ssh进程,这样就可以简化重新 建立起forward tunnel的过程。可以使用autossh,或者自己写的脚本来检查ssh tunnel进程是否 存在,如果不在就可以重新启动一个。

Could not open a connection to your authentication agent

这个错误的意思是没有办法连接到auth agent,原因要么是agent没有运行起来,要么是ssh-add 没有连接到agent的环境参数。 Provide bash to ssh-agent if it throws the error message above.

ssh-agent bash
#Or,
eval "$(ssh-agent)"
ssh-add

ssh passphrase, pin code

为了保护私钥,我们通常会用密码加密它。该加密的密码通常叫做pin code或 passphrase。如果 私钥是个人电脑等安全性较弱的终端,通常建议设置该密码。如果是在服务器端,或者为了自动化处理, 通常会去掉该密码。

openssh和openssl都提供了密钥生成的命令,并可以设置、修改或去除密码。

openssh ssh-keygen 更新密钥密码

ssh-keygen 是 openssh 提供的密钥管理工具。其修改密码的命令为:

ssh-keygen -p -O old-passphrase -N new-passphrase -f key-file
# 或者 在命令提示符下提供密码。
ssh-keygen -p -f key-file

openssl 更新密钥密码

根据密钥算法的类型,可以分别使用对应的命令来管理密钥。 除了类型不同, 三个类型的命令格式非常相似。空的new-pass会将密码除去。如果不在命令行上指定密码, 那么命令会提示输入旧、新密码。

RSA类型

# rsa
openssl rsa -in infile -out outfile -passin old-pass -passout new-pass

DSA类型

# dsa,
openssl dsa -in infile -out outfile -passin old-pass -passout new-pass
# 空的new-pass会将密码除去。不再命令行上指定密码,那么该命令会提示输入旧、新密码。

EC DSA类型

#ecdsa
openssl ec -in infile -out outfile -passin old-pass -passout new-pass

ssh over ssh

我们需要从公司网络,通过跳板机访问实验或生产的内网,通过建立起ssh over ssh的机制,可以 将两次登陆的过程,自动化为只输入一次的命令。

个人电脑 --> (跳板机) --> (服务器A,服务器B,服务器C, ...)

#.ssh/config
host jump-server
  IdentityFile <path to private key file>

host server-a server-b server-c
  ProxyCommand ssh -W %h:%p user@jump-server

在跳板机上,不需要配置相应的使用key登陆内部机器的ssh key, 会使用个人电脑上的.ssh/config 配置。