SSH协议实现了与telnet服务类似的远程登录功能,由于telnet在网络上不是很安全,SSH协议在网络中使用密文传输数据,所以现在已成为telnet的替代产品。SSH协议在网络中传输的任何数据都进行加密处理,而telnet协议是以明文的方式在网络中传输,包括用户登录时输入的用户口令,这样很容易被黑客捕获到。相比之下,SSH比telnet安全多了。
1.安装
环境:Ubuntu 12.04
服务器端:$ sudo apt-get install ssh openssh-server ssh-import-id
客户端: $ sudo apt-get install openssh-client
2.配置
2.1 修改服务器端ssh端口
默认的ssh端口是22,太扎眼,建议改成别的端口,比如3305
$ sudo vim /etc/ssh/sshd_config ,将其中的 port 22 改成
port 3305
改完要重启ssh服务:$ sudo /etc/init.d/ssh restart(可通过命令:ps -e | grep ssd查看ssh是否已经运行)
2.2 服务器端开机自动启动 ( 安装后默认地已经以openssh-daemon在后台运行了,开机后也会自动以openssh-daemon在后台运行,可通过ps -e | grep ssh查看。 也可以使用chkconfig来设置自动启动。)
3.远程登录
一般登录ssh服务器的方式有两种:
一是基于口令的安全认证,与telnet类似,提供正确的用户口令后就可以远程登录服务器,但口令和数据在传输过程中都会被加密。
二是基于密钥的安全认证,使用公钥和私钥的方式对用户进行认证。
3.1 使用密码口令登录
在客户端,执行以下命令登录ssh服务器:
$ ssh jim@192.168.1.103 -p 3305 ,jim为server端的用户名,192.168.56.101为服务端IP,3305为端口号
ssh jim@192.168.1.103 -p3305
jim@192.168.1.103's password: (输入服务器端的登录密码)
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic-pae i686)
* Documentation: https://help.ubuntu.com/
322 packages can be updated.
103 updates are security updates.
Last login: Mon Jan 14 12:26:19 2013 from ubuntu-2.local
* Starting OpenBSD Secure Shell server sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
[ OK ]
看到类似这些信息就说明登录成功了。这种方式比较简单,但安全性稍差。
另外,初次登录服务器时会出现许多信息,这是因为ssh不能识别这台服务器主机,输入yes后将会把这台服务器的信息写入~/.ssh/known_hosts文件,下次登录时就不会出现这样的信息。
退出登录,只需在客户端执行 exit 命令即可
3.2 公钥-私钥登录
第一步:生成SSH用户的公钥和私钥对文件
在 client 端执行:$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): #这里输入私钥密码,直接回车表示私钥密码为空
Enter same passphrase again:
Your identification has been saved in /home/lu/.ssh/id_rsa.
Your public key has been saved in /home/lu/.ssh/id_rsa.pub.
The key fingerprint is:
da:ff:bf:3c:a8:fe:cc:f7:ba:74:8a:37:b2:b0:77:7a lu@ubuntu
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| |
| S |
| o |
| . . . .. .|
| . =++Eo |
| .==OXBB.|
+-----------------+
查看~/.ssh目录,会生成id_rsa、id_rsa.pub ,id_rsa是私钥文件需要严格保密,id_rsa.pub是公钥文件,可发布到SSH服务器中。通常需要修改客户端id_rsa.pub属性为600,否则会出现:
Permissions 0644 for ‘/home/lu/.ssh/id_rsa’ are too open. 等错误提示
第二步:上传公钥
在client端执行:$ ssh-copy-id "-p 3305 -i ~/.ssh/id_rsa.pub jim@192.168.1.103"
将SSH客户的公钥添加到SSH服务器中用户的认证文件中,这样当登录server时,client会向server提出请求,用私钥认证,server收到请求后,寻找公钥进行身份认证。
Warning: Identity file ~/.ssh/id_rsa.pub not accessible: No such file or directory.
Enter passphrase for key '/home/jim/.ssh/id_rsa':
jim@192.168.1.103's password: # 这里输入SSH服务器的登录密码
Now try logging into the machine, with "ssh '-p 3305 -i ~/.ssh/id_rsa.pub jim@192.168.1.103'", and check in:
~/.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
上传成功,查看服务器端 ~/.ssh/目录会生成authorized_keys文件。
第三步:登录 ssh server
在client端:$ ssh -p 3305 -i ~/.ssh/id_rsa jim@192.168.1.103,采用私钥认证
Enter passphrase for key '/home/lu/.ssh/id_rsa': # 这里输入前面设置的私钥
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic-pae i686)
* Documentation: https://help.ubuntu.com/
322 packages can be updated.
103 updates are security updates.
Last login: Mon Jan 14 15:19:44 2013 from ubuntu-2.local
* Starting OpenBSD Secure Shell server sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
[ OK ]
如果在生成密钥对时指定私钥为空,则不用输入私钥即可登录成功
私钥和公钥是成对的,如果把公钥上传给server后再用ssh-keygen -t rsa命令生成一个新的私钥代替原来的私钥,就算私钥密码相同,则新的私钥依然不能用来验证server上的公钥。也就是说私钥和公钥必须是成对的。
看一下客户端本地的.ssh目录有这么几个文件:
id_rsa // 这是私钥
id_rsa.pub // 这是公钥
known_hosts // 这是你所有访问过的ssh服务器的公钥信息,如果没有这个文件的话,下次登录时会提示信息
4. client端和server端实现文件拷贝
4.1 Linux下使用scp命令
把文件从server端拷到本地:$ scp -P 3305 -r jim@192.168.1.103:/home/jim/test/t.cpp ./
把文件从本地拷到server端:$ scp -P 3305 -r ./t.txt jim@192.168.1.103:/home/jim/test/
4.2 Linux下使用rsync命令
如果使用rsync默认端口号873:
把文件从server端拷到本地:$ rsync -v -u -a --delete --rsh=ssh --stats jim@192.168.1.103:/home/jim/test/t.cpp ./
把文件从本地拷到server端:$ rsync -v -u -a --delete --rsh=ssh --stats ./t.txt jim@192.168.1.103:/home/jim/test/
如果不使用rsync默认端口号则会出现问题,解决办法:
server ---> 本地:$ rsync -v -u -a --delete --rsh=ssh -e "ssh -p 3305" --stats jim@192.168.1.103:/home/jim/test/t.cpp ./
本地 ---> server:$ rsync -v -u -a --delete --rsh=ssh -e "ssh -p 3305" --stats ./t.txt jim@192.168.1.103:/home/jim/test/
5. windows下访问ubuntu ssh server
工具:putty
如果使用密码口令登录:
打开putty,设置好ssh server的IP和端口号后,在 Window ---> Translation下选择Remote charcater set:UTF-8,否则打开的终端界面如果有汉字会出现乱码。
然后输入用户名、密码即可。
如果使用私钥登录:
首先,我们需要将 id_rsa 文件转化为 Putty 支持的格式。这里我们需要利用 Puttygen 这个工具:
点击 Puttygen 界面中的 Load 按钮,选择 id_rsa 文件,这个私钥必须与ssh上的某个公钥成对,然后输入私钥密码(如果有的话)
再点击 Save private key 按钮,输入文件名 putty_id_rsa,保存类型为ppk。这样 Putty 接受的私钥就做好了。
打开 Putty,在 Session 中输入服务器的 IP 地址、端口号,在 Connection ---> SSH ---> Auth 下点击 Browse 按钮,选择刚才生成好的私钥。
如果在生成 putty_id_rsa.ppk 的时候输入了密码,即私钥是加密的,那么点击open 就可以使用私钥登录而不用使用密码。
如果在生成 putty_id_rsa.ppk 的时候没有输入密码,即私钥没有加密,那么可以在 putty.exe 的 Connection ---> Data 的 Auto-login username 中输入私钥的用户(ssh server 的用户名),然后点击 open 就可以自动登录。