分类: LINUX
2010-09-16 20:49:53
linux下用ssh登录别的机器的时候,需要通过交互方式手工输入密码,ssh不支持直接加密码的选项,它觉得这样不安全。 但是有时候要完成一些自动的任务,比如登录到别的机器上,并在那台机器上启动一些程序,这时候该怎么办呢?
下面提供几种方法:
1 | #!/usr/bin/expect |
把上面的代码中的username和hostname替换为你的用户名和ip,然后保存为ssh.exp,再执行下面的代码:
1 | chown +x ssh.exp |
就可以自动登录到目标机器上并执行一下ls命令。
这个方法有个缺点,就是密码以明文的方式保存在文件里,不安全。
sshpass -p password ssh host -l username |
rsync是一个同步的命令, 它是通过ssh来同步的, 如果你想执行rsync的时候也不输入密码, 可以通过指定rsync的”–rsh”选项来实现, 比如:
rsync --rsh='sshpass -p password ssh -l username' host.example.com:path |
如果想要scp也不输入密码的话,建立下面的文件:
1 | #!/usr/bin/env bash |
然后这样使用scp:
scp -S path-of-ssh.sh/ssh.sh file user@host:path |
该方法使用起来简单, 缺点也是密码以明文方式保存.
1 | # 1. 生成密钥 |
经过上面的操作,再登录到目标机器上执行:
1 | mkdir -p ~/.ssh |
注意:上面代码中的chmod修改权限的语句必须执行,有的ssh设置使得.ssh目录和authorized_keys的权限必须只能自己可读可写,如果权限没设对的话,照样不能免认证登录,这是为了安全考虑。
经过上面的操作,你现在就可以不需要输入密码就可以登录到目标机器上了。
ssh-copy-id [username]@hostname |
很简单吧!
上面的方法3由于不需要把密码明文直接写到文件里面,所以比较安全,方法4和方法3本质上是一样的。
现在我们来考虑另外一个问题。
假如你通过方法2设置了免认证登录,这样, 只要别人拿到了你的私钥, 就可以登录所有已经认证你的机器了. 当然你也可以为你的私钥设置一个密码, 这是通过ssh-keygen的”-P”的来设置的. 但是现在又有一个问题, 那就是你每次登录到已经认证过你的机器的时候, 你都要输入一次你的私钥密码. keychain是解决这个问题的一个很好的工具, 它是ssh-agent的一个前端, 它会把已经认证过的密钥加入ssh-agent的高速缓存, 这样, 只有你第一次使用你的私钥登录别的机器的时候, 需要输入一下密码, 以后再次使用你的私钥的时候, 就不用输入密码了, 既保证了安全性, 又保证了便捷性.
讲完了上面说的免认证登录方法,我们现在可以很简单的让一个集群之间的每一台机器之间都互相免认证,而且完全自动化。
方法就是:先在集群中的某一台机器上生成好密钥,并且把这台机器自己的公钥添加到它自己的认证文件里面,这样就实现了这台机器免认证登录自己。然后利用
expect向每一台机器拷贝刚才那台机器的公私钥和认证文件,这样这个集群中所有机器的公私钥和认证文件都一样了,而刚才那台机器已经可以免认证登录自
己,它们之间也当然可以免认证登录了(:),是不是有点绕?)。这个方法会让每台机器的公私钥都一样,如果集群机器中已经配置了一些其他免认证登录的信
息,不能破坏已有的公私钥,这个方法就不能凑效了,只能每两台机器之间互相调用ssh-copy-id命令。
上面的方法具体实现如下:
在集群中某一台机器上执行:
1 | ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa |
然后拷贝该机器的公私钥和认证文件到其他的机器上:
1 | #!/usr/bin/expect |
把上面的scp-auth.exp文件保存后,执行下面的命令:
1 | chmod +x scp-auth.exp |
其中hostlist文件为你的所有要拷贝认证文件的机器列表,每行一条记录, 每条记录的格式为:
现在你可以在这个机器集群上自由的穿梭了, 不用输入任何密码!
expect很方便吧, 它最大的用处就是用来为那些需要交互的程序模拟用户的输入, 比如passwd, ssh, fsck, ftp等.