通过ssh登陆到远程机器是大家十分熟悉的工作方式,但是有时候我们需要在脚本中自动执行一些操作,但是在脚本中如何输入密码却是不容易解决的问题,(参考),但是对于ssh来讲我们有更为方便的选择。
从客户端来看,SSH提供两种级别的安全验证。
第一种级别(基于口令的安全验证),只要你知道自己的帐号和口令,就可以登录到远程主机,并且所有传输的数据都会被加密。但是,这种验证方式不能保证你正在连接的服务器就是你想连接的服务器。
第二种级别(基于密匙的安全验证),需要依靠密匙,也就是你必须为自己创建一对密匙,并把公有密匙放在需要访问的服务器上。如果你要连接到SSH服务
器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的用户根目录下寻找你的公有密匙,然后把它和
你发送过来的公有密匙进行比较。如果两个密匙一致,服务器就用公有密匙加密"质询"(challenge)并把它发送给客户端软件。客户端软件收到"质
询"之后就可以用你的私人密匙解密再把它发送给服务器。
与第一种级别相比,第二种级别不需要在网络上传送用户口令。另外,第二种级别不仅加密所有传送的数据,而"中间人"这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能慢一些。
ssh-keygen支持生成两种类型的key,RSA和DSA,这里选择RSA
[harry@localhost ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/harry/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/harry/.ssh/id_rsa.
Your public key has been saved in /home/harry/.ssh/id_rsa.pub.
The key fingerprint is:
48:4f:d6:25:90:17:95:d6:78:e8:36:a8:bc:9a:b1:5d harry@localhost.localdomain
可以看出 ~/.ssh/id_rsa.pub 就是公共密钥,~/.ssh/id_rsa 是私有密钥
生成密钥之后把这个密钥对中的公共密钥复制到你要访问的机器上去,并保存为
scp id_ras.pub remote@rh:/home/rh/.ssh/authorized_keys
登陆访问的机器修改用户 .ssh 目录的权限,使用命令 "chmod 755 ~/.ssh"
修改之后,你再用ssh scp sftp 之类的访问那台机器时,就不用输入密码了,用在script上更是方便。
这种方法的好处在于:ssh访问目标机器的用户修改密码后,不会产生任何影响。
现在我们可以通过ssh来运行脚本了
harryhe@rock:~/.ssh$ ssh 10.192.208.95 -l harry "ls ~/test"
automake
fcntl
iconv
reg
harryhe@rock:~/.ssh$
更进一步的,如果我们在脚本中用这种方式运行命令,一个缺点是需要反复的登陆ssh,或者同时登陆多个,而ssh的密钥登陆方式很慢,通过在~/.ssh/config中设定controlmaster,我们可以支持ssh通道重用,也就是多个ssh登陆使用同一个通道,这样只在第一次登陆的时候比较慢,以后再登陆就很快了。
harryhe@rock:~/.ssh$ ls
config id_rsa id_rsa.pub known_hosts
harryhe@rock:~/.ssh$ cat config
host 192.168.70.2
controlmaster auto
controlpath /tmp/ssh-%r@%h:%p
据说版本在4.0 ~ 4.2 是不支持ControlPath的,那么需要手动了.
ssh -M -S ~/.ssh/remote-host user@remotehost
建立这个连接之后,再
ssh -S ~/.ssh/remote-host user@remotehost
就可以了
阅读(13514) | 评论(0) | 转发(1) |