SSH与SCP小指南

一.SSH

1.掀起SSH的盖头来

Linux下有很多用于网络传输,远程控制的工具,如rsh、FTP、POP和Telnet。但是它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。故需要更加安全的方式,于是就诞生了SSH.

如下图传统的网络服务程序,如rsh、FTP、POP和Telnet等表示:

Telnet等传统网络传输工具

SSH,即 Secure SHell的缩写,从释义(安全的shell)来看,其重头戏就是安全性,在Linux下广泛使用免费的OpenSSH程序来实现SSH协议。

SSH

更多关于SSH的内容,可以参考WIKI,这里我总结如下

优势:

SSH是在应用层和传输层基础上的安全协议;对传输的所有数据包括明文传送数据、用户帐号和用户口令等进行加密处理所以其安全性是无可比拟的;由于其传输的数据可以是经过压缩的,所以其传输速度很快;对于提供了密钥后,SSH连接变得简易方便;SSH协议同时也提供可扩展能力。

框架:
SSH协议框架中最主要的部分是三个协议:传输层协议(The Transport Layer Protocol)/用户认证协议(The User Authentication Protocol) /连接协议(The Connection Protocol).框架示意图可表示如下:

SSH与SCP小指南

图片出处:SSH协议交互过程

安全:

SSH提供了两种级别的安全验证,基于口令和基于密钥。

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

第二种级别(基于密钥的安全验证),需要依靠密钥,也就是你必须为自己创建一对密钥,并把公有密钥放在需要访问的服务器上。客户端软件会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在你在该服务器的用户根目录下寻找你的公有密钥,然后把它和你发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有密钥加密“质询”(challenge)并把它发送给客户端软件。从而避免被“中间人”攻击。

为了更形象,我绘丑图如下:

SSH与SCP小指南

第一种方式常见于要求你输入用户名(Linux分配给你的用户)和密码,如下:

[beginman@beginman ~]$ ssh -p 6022 [email protected]
[email protected]'s password: 

第二种方式常见于我们使用Git或github时,往自己用户下添加密钥的方式。如:

[beginman@beginman .ssh]$ ssh -T [email protected]
Hi BeginMan! You've successfully authenticated, but GitHub does not provide shell access.
[beginman@beginman .ssh]$ 

2.入门指南

2.1远程登录

远程登陆,需要用户名user,登录远程主机host,命令如下:

ssh username@host
ssh host

如果本地用户名与远程用户名一致,登录时可以省略用户名。

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。

ssh username@host

在第一次登陆远程时,会有如下提醒,质询是否加入远程known_hosts文件中:

The authenticity of host 'arvo.suso.org (216.9.132.134)' can't be established.
RSA key fingerprint is 53:b4:ad:c8:51:17:99:4b:c9:08:ac:c1:b6:05:71:9b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'arvo.suso.org' (RSA) to the list of known hosts.

下次再连接这台主机,远程主机会辨识SSH用户的公钥是否保存本地,若已保存则跳过警告部分,直接提示输入密码。但是还是会每次都输入密码,很烦人,能不能跳过这个步骤呢?这就用到了公钥登录了。这就是下面所要学习的内容,SSH key!

3.SSH Key是什么

SSH key将会自动登陆远程主机,而不用使用密码,这对于频繁远程连接和Scp操作是很方便的。它会在用户主目录.ssh目录下生成密钥对(公钥和私钥)。

用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

SSH与SCP小指南

4.SSH Key的常用操作流程

提示:如果本地存在密钥对最好先保存到另外文件夹内,以免覆盖了

(1.)生成密钥对

[beginman@beginman ~]$ ssh-keygen -b 1024 -t dsa -f mykey
Generating public/private dsa key pair.
Enter file in which to save the key (/home/usrname/.ssh/id_dsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in mykey.
Your public key has been saved in mykey.pub.
The key fingerprint is:
be:06:62:42:30:93:56:dd:c7:d8:c7:91:2b:44:d1:2d beginman@beginman
The key's randomart image is:
+--[ DSA 1024]----+
| .... . =o+.+    |
|=.   . o = E .   |
|.+      o . o    |
|  .      . .     |
| .      S .      |
|  . o ..         |
|   o . ..        |
|        ..       |
|       ..        |
+-----------------+

上面用ssh-keygen命令生成名为mykey(-f name用于命名,默认是id_xxx,如id_dsa或id_rsa等),大小为1024bit(-b 1024) ,类型为dsa(-t dsa, 也可以设置-t rsa)的密钥对。然后会质询存放在哪里,对于第一次生成key而言。默认是标准目录.ssh下,然后质询是否输入密码短句(passphrase),用于密码输入,好处是简单,不易破解,坏处就是每次都要输入密码短句。

更多ssh-key语法知识参考Linux / Unix Command: ssh-keygen.

(2).配置远程主机

这里分三步:

步骤一:copy公钥到远程服务器并更名

在本地生成了密钥对,如我的是mykey和mykey.pub,放在了主目录下的.ssh目录下,然后我需要把mykey.pub复制到远程主机上,放在远程主机用户主目录下.ssh里,如没有可自行创建.ssh目录。操作如下:

# 默认保存到用户主目录下
scp ~.ssh/mykey.pub [email protected]:

#如确定.ssh目录存在可直接保存其下
scp ~.ssh/mykey.pub [email protected]:~.ssh/

注意在服务器主机名后面的 :

然后在主机上把你copy的公钥更名为:'authorized_keys'。

$ mv ~/id_dsa.pub >> ~/.ssh/authorized_keys

注意,这个authorized_keys可以是多个SSH用户共享的,如果已经存在了,说明其他用户已经把其公钥添加进去了,此时我们只需将自己的公钥内容追加其后就行了。如

#用户A
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAupPq1Eb4QHkzI3W8RQh4wY8R6rAik37rj8iFPXEYQea+63xdyDSR8CfyVLyVRx+5DusKWYhjkr6EXDGDOokfG....... A@A

#用户B
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwrF+tFQY6/0bQc2OWVVLe5+NWYbmlLBishBKT7CXXvuBbbIFsFP1EE9vUSxdnbgXz668U4f67m5Q.................. B@B

#用户C:Beginman
ssh-dss AAAAB3NzaC1kc3MAAACBAJC9t2HEI1bmchNw8wP11cqpcNgwetyqVuDb6zC4ky2BdO1cOpKLtgC2enAwWv81eWgf8Q2ADN9VCl95G8RHj412LfYKaiMrM8j7Ovwx18+3JA/cNwkrDfGNW1siF4r6fnI2ua5EpscUepiIn4FYbQvJerSq85YZXSFn2Gyu8zb7AAAAFQD+SfwgGNqsohHz49K1v0LfwNwbpwAAAIEAi2fMrcydGYnuPhXi0aAMab2JT0ocu1sWQFmu4dr4QxqhcDzcPBTI06y2gCuFmDghBaacimmUJcAuFE..........pR+DTrMdHFs9tsRp1Gy8mc+bsGm2MFh345pQiCyuuShuRZGs+7F8RQUk= beginman@beginman

最后一条就是将自己的mykey.pub内容粘贴其后,可不能删了别人的啊。

步骤二:更改远程服务器.ssh和authorized_keys的权限

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

步骤三:更改本地.ssh的权限

#取消“组用户”(group)和“其它用户”(other)对于.ssh目录的写权限
$ chmod go-w ~/.ssh

那么接下来就可以直接访问远程主机而不在输入密码了,如果一开始你生成key的时候设置了密码短句,那么不好意思,你还是需要输入密码短句,而非密码了,这里一般一路回车即可。

注意:

还有一个比较方便的命令就是:

ssh-copy-id  [email protected]
ssh-copy-id  “-p 6022 [email protected]"  #如果端口是6022 
ssh-copy-id -i ~/.ssh/my.pub  [email protected]

ssh-copy-id所实现的可能就是:

ssh-copy-id 把本地主机的公钥复制到远程主机的authorized_keys文件上(如果不存在则自动创建并复制上)。ssh-copy-id 也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限

补充:

# 可以在ssh中运行命令
ssh [email protected] ls -l /

5.ssh-agent是个什么玩意儿

ssh-agent是OpenSSH中默认包括的(ssh代理程序),它所代理的就是上面说的,如果你设置了密码短句,它会帮你记住,而不是让你一次次的手动输入。

之前演示了无密码短语的情况,这个都比较好处理,下面演示有密码短语情况,且想连接远程主机B.

[beginman@beginman .ssh]$ ssh-keygen -t rsa -f 102  
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in 102.
Your public key has been saved in 102.pub.
The key fingerprint is:
68:a9:8d:b1:ce:0b:a9:d3:16:9a:b7:a5:7f:ff:cf:19 beginman@beginman
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       o         |
|    . + S        |
|  .. B           |
| +o.= .     E    |
|+.+*  .    . o   |
|.+oo=o .....+    |
+-----------------+

这里使用rsa格式且名称为102的key,然后输入密码短语为"hello".接下来的步骤就同上了,公钥添加到远程主机B上。

[beginman@beginman .ssh]$ scp -P 6022 102.pub [email protected]:

接下来的步骤同上,这里略过。配置完成之后,开始连接远程主机B,在执行 ssh -p 6022 由于我们设置了密码短语,在Ubuntu下会弹出一个输入框,用于输入密码短语,也可以勾选自动解锁。

SSH与SCP小指南

然后以后在登陆时,如果没有超过会话保存时间,则无需再输入密码短语,直接登陆。

密码太多,容易忘记,于是就想着让机器自己保存着密码,下面就是ssh-agent代理大展拳脚的时候了。

打印环境变量:

[beginman@beginman ~]$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-jDC7ffuxefeL/agent.20198; export SSH_AUTH_SOCK;
SSH_AGENT_PID=20199; export SSH_AGENT_PID;
echo Agent pid 20199;

使用变量:

[beginman@beginman qiniu]$ eval `ssh-agent`  # 注意 这个是Tab键上的`字符,不是单引号啊
Agent pid 20210

加入/etc/profile:

#以root身份加入
root@beginman:~# echo 'eval `ssh-agent`' >> /etc/profile  # 外层单引号

添加私钥:

要把对应的私钥添加进去,使用命令ssh-add,后面跟着对应的私钥路径,之后把之前输入的密码短语再次输入进去。

[beginman@beginman ~]$ ssh-add .ssh/102
Enter passphrase for .ssh/102: 
Identity added: .ssh/102 (.ssh/102)

完成后,就可以登录你的远程服务器而不用输入你的密码了,且你的私钥是密码保护的。但唯一不好的一点就是每次打开一个新的控制台(shell)都需要创建一个新的ssh-agent实例,这意味着你每次都要在控制台中运行 ssh-add。解决办法就是使用无密码短语,或老老实实就在一个shell下执行。

6.X11 Session Forwarding

X11 forwarding-基于SSH使用远程X-Windows应用,而X11是X Window System主版本11的缩写,它不光是一个基本的GUI软件,X11也被定义为一个网络协议。通过Window远程访问Linux主机,在Windows系统下,用的比较多就应该就是PUTTY,SecureCRT,Xshell。

在window下我常用SecureCRT,现在在linux下我也用这个了,比较方便,关于x11 forwarding,可以参考这个使用 SSH 远程连接运行图形界面程序(ubuntu).

还有一个视频视频: X11 forwarding-基于SSH使用远程X-Windows应用

二.SCP

SCP是SSH协议下的传输命令,演示如下:

1.本地文件传输到远程主机上

#保存到远程主机主目录下
[beginman@beginman ~]$ scp a.py [email protected]:

#端口为6022
[beginman@beginman ~]$ scp -P 6022 a.py [email protected]:
a.py                                       100%    0     0.0KB/s   00:00    

#指定路径和名称
[beginman@beginman ~]$ scp -P 6022 a.py [email protected]:mydata/beginman/hello.py

#批量上传
 [beginman@beginman ~]$ scp -P 6022 *.py [email protected]:

2.将本地目录上传到远程服务器上

# -r表示递归,将该目录和目录下所有文件和目录复制到远程主机 mydatas/beginman里
[beginman@beginman ~]$ scp -r learn/py/ [email protected]:mydatas/beginman/

3.将远程主机文件复制到本地

[beginman@beginman ~]$ scp [email protected]:install.log test/log.log

4.将远程主机上的目录复制本地

[beginman@beginman ~]$ scp -r [email protected]:/root/mysql-5.6.10/man test/

参考

1.SSH Tutorial for Linux

2.SSH and SCP: Howto, tips & tricks

3.SSH原理与运用(一):远程登录

4.SSH Keys

你可能感兴趣的:(ssh)