首页 > TroubleShooting > 命令行ssh在远程服务器上su执行程序的情况

命令行ssh在远程服务器上su执行程序的情况

2011年6月12日 发表评论 阅读评论

需求来源:
组里某人的私钥丢了,没法登录服务器,需要给他把公钥重新部署在他要登录的服务器。
背景资料:
公司的服务器都是key认证的,而且都已经禁止root直接登录,这个家伙的私钥丢失导致我们需要在所有的100多台服务器上重新部署他新生成的公钥!
解决方法的基本思路:
用普通用户ssh上每一台服务器执行命令

su -c wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone
这里的someone是某人的帐号

但上面这个命令其实是有问题的,因为su -c只支持单个命令,所以上面这个命令直接在本地执行都会报”su: user xxx does not exist”,这是因为su只把wget当作命令,因为前面没有指定su成的用户,所以把后面的部分当成用户名了,解决问题也很简单,这样:

su - root -c "wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone"

su -c "wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone"

总之,诀窍就是要把命令用双引号引起来。
好,本地执行现在没有问题了,现在要远程执行,假设要在服务器192.168.0.2上执行,命令大概是这样的:

ssh 192.168.0.2 su -c “wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone”

这样执行实际也是有问题的。会报错:“standard in must be a tty”
这是因为su只能从tty中读入密码。这个也好解决,ssh命令加上”-t”参数就行,像这样:

ssh -t 192.168.0.2 su -c "wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone"

但当你这样执行的时候会发现还会报开始的用户不存在的错误,像这样:“su: user xxx does not exist”
这样的话,最后是这样解决的:

ssh -t 192.168.0.2 'su -c "wget -O ~someone/.ssh/authorized_keys http://192.168.0.1/public_key4someone"'

现在就应该能正确执行了。至于这里为什么要加对单引号,我也不确认知道,反正成功了,:-)

btw:其实这整个解决方案还是有问题的,你需要手工输入每一台服务器的密码呀!

分类: TroubleShooting 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.