您的位置:首页 > 其它

ssh自动登录并执行命令以及plink

2014-11-10 16:25 363 查看
最近碰到一个案例,涉及到一些ssh相关有意思的东西,与大家分享。

本文ssh命令是指Linux系统通常配备,即openssh的ssh命令;plink是指从putty源码编译来的plink程序。

案例说明:

需要在azure上创建Linux虚拟机(本文以基于CentOS的镜像为例),并返回给用户root账户和密码;要求使用脚本把这个过程自动化(即执行脚本后无人工干预,直接得到所需的结果)。

创建虚拟机比较简单,使用Azure command-line tools的"azure vm create"系列命令即可,但问题是这个命令不支持在命令行指定root用户和密码,只能先指定另外一个临账户和密码,然后ssh登录到创建的虚拟机,使用"sudo passwd ..."命令来修改密码,修改密码后再以root用户登录将创建时指定的临时账户再删除。虽然只是这么拐了一个小弯,但是因为自动化的要求,导致下面一系列问题需要解决(大部分是需要避免交互):

1. ssh命令没法指定密码,需要手动输入;【解决方法:使用plink的-pw选项指定参数】

2. ssh命令和plink首次登录时都会要求手动确认主机并缓存host key(第二次就不需要了);

3. sudo命令执行时需要一个终端(tty);【ssh和plink的"-t"参数都可以解决这个问题】

4. 终端中首次sudo时需要输入当前用户密码;

5. passwd命令修改密码时需要输入新密码;

下面按顺序分别分析:

1. 不需要密码的ssh登录一般需要进行公私钥之类的配置,但进行这类配置显然要登录到主机或打开azure管理门户进行操作,显然违背了自动化的要求,所以只好采用plink工具来解决。

2. 对于ssh命令有好几个办法来解决。其一,获取虚拟机的主机IP后,可以在~/.ssh/config配置文件写入"Host host-ip"和"StrictHostKeyChecking no"这两行,然后登录时会自动保存该主机的host key;其二,使用ssh-keyscan命令,生成主机ip对于的host key,然后加入到~/.ssh/known_hosts文件中,这样就无需再次确认主机。命令是"echo <host-ip>
| ssh-keyscan -t rsa -f - >>~/.ssh/known_hosts"。

对于plink命令,简单的办法是"echo y | plink .......",这是在plink提示时自动确认为y(这种方法ssh命令没法用)。复杂一点的办法是将通过ssh-keyscan生成的host key转化为plink所用的格式,附加到~/.putty/sshhostkeys文件中,使用的工具是putty源码中自带的python脚本(contrib目录下)kh2reg.py,命令是"echo
<host-ip> | ssh-keyscan -t rsa -f - | kh2reg.py --unix"。

3. 虽然可以修改sudo的相关配置文件(注释掉requiretty),取消终端的需求,但这已经涉及到了交互,所以不能用,只能采用上面给出的办法。

4. 为sudo执行"-S"参数,然后用echo输出密码,即"echo <password> | sudo -S ......"。

5. 为passwd命令指定“--stdin”参数,并用echo输出密码,即"echo <new passwd> | passwd <user>"。

最后用到的命令是:

echo y | ./plink -l ${USER} -pw ${PASS}  ${VIRTUALIP} echo -e \nSuccessfully Logined!\n  #先登录一次执行一下echo这个简单命令,这样就缓存了host key
./plink -l ${USER} -pw ${PASS} -t ${VIRTUALIP} "echo ${PASS} | sudo -S -p '' sh -c 'echo ${ROOTPASS} | passwd --stdin root'"
./plink -l root -pw ${ROOTPASS}  ${VIRTUALIP} userdel -r -f ${USER}  #删除临时账户
其中,USER和PASS是azure在创建虚拟机命令中指定的临时用户名和和密码。ROOTPASS是所要设置的root密码,VIRTUALIP是主机的IP。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: