社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  分享发现

[精华] SSH与SCP小指南

BeginMan • 9 年前 • 4475 次点击  

一.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协议交互过程

安全:

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

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

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

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

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

[beginman@beginman ]$ ssh -p 6022 root@111.255.111.112
root@111.255.111.112's password:

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

[beginman@beginman .ssh]$ ssh -T git@github.com
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,不再要求密码。

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 root@111.116.255.111:

#如确定.ssh目录存在可直接保存其下
scp ~.ssh/mykey.pub root@111.116.255.111:~.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  root@111.116.255.111
ssh-copy-id  -p 6022 root@111.116.255.111"  #如果端口是6022 
ssh-copy-id -i ~/.ssh/my.pub  root@111.168.0.111

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

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

补充:

# 可以在ssh中运行命令
ssh root@remotehost.net 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 root@111.111.122.102:

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

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

密码太多,容易忘记,于是就想着让机器自己保存着密码,下面就是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 root@192.168.0.111:

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

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

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

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

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

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

[beginman@beginman ~]$ scp root@192.168.0.111:install.log test/log.log

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

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

参考

1.SSH Tutorial for Linux

2.SSH and SCP: Howto, tips & tricks

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

4.SSH Keys

文章同步在http://beginman.cn

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/497
 
4475 次点击  
文章 [ 1 ]  |  最新文章 9 年前
Py站长
Reply   •   1 楼
Py站长    9 年前

支持~~