什么是 SSH?安装、基本使用、远程登录、scp跨机远程复制...
什么是SSH?
简单来说,SSH是一种用于计算机之间加密登录的网络协议。如果用户使用SSH协议从本地计算机登录到另一台远程计算机,我们可以相信这种登录是安全的,即使中途被拦截,密码也不会泄露。早期,互联网通信都是纯文本形式。一旦被拦截,内容就会被泄露。 1995年,芬兰总统学者、Tatu和Ylonen设计了SSH协议,该协议对所有登录信息进行加密,成为互联网安全的根本解决方案。它很快在全球范围内推广,现已成为Linux系统的标准配置。
SSH 只是一种协议,有多种实现方式,包括商业的和开源的。本文针对的实现是 OpenSSH,它是免费软件并且被广泛使用。这里我们只讨论Linux Shell中SSH的使用。如果你想在Windows系统中使用SSH,你会使用另一个软件PuTTY,这个软件将在另一篇文章中介绍。
中间人攻击
SSH之所以能保证安全,是因为它使用了公钥加密。
整个过程如下: (1) 远程主机收到用户的登录请求,并将其公钥发送给用户。 (2) 用户使用该公钥对登录密码进行加密并发回。 (3)远程主机使用自己的私钥解密登录密码。如果密码正确,则允许用户登录。
这个过程本身是安全的,但其实现过程中存在风险:如果有人拦截登录请求,冒充远程主机,将伪造的公钥发送给用户,用户将很难辨别真伪。因为与https协议不同,SSH协议的公钥没有经过证书颁发机构(CA)公证,即都是自己签名的。
可以想象,如果攻击者将自己插入到用户和远程主机之间(例如在公共wifi区域),他使用伪造的公钥来获取用户的登录密码。如果您随后使用此密码登录远程主机,SSH 安全机制将消失。这种风险被称为“中间人攻击”。
SSH安装
SSH分为客户端openssh-client和openssh-server
如果你只是想在其他机器上登录SSH,则只需要安装openssh-client即可(ubuntu有默认安装,如果没有sudoapt-get install openssh-client),如果要在本机上开启SSH服务,则需要安装openssh-server。
Ubuntu 默认安装了 ssh 客户端。
#配置ssh#
echo -e "\033[31;1m ****************************** * \033[0m"
echo -e "\033[31;1m **************安装和配置 ssh**************** ** \ 033[ 0m"
sudo apt-get install -y openssh-server 1> /dev/null
sudo sed -i 's/UsePAM no/UsePAM yes/g' /etc/ssh/sshd_config su sed -i '8a /etc/init.d/ssh start' /etc/profile
sudo /etc/init.d/ssh start
ps -e | grep ssh
echo -e "\033[ 31;1m ssh-authorization\033[0m"
cd ~/.ssh/
ssh-keygen -t rsa/ Authorized_keys
$ ps - e|grep ssh
2151? 00:00:00 ssh-agent
5313? 00:00:00 sshd
ssh 代理表示 ssh 客户端已启动,sshd 表示 ssh 服务器已启动。
如果缺少sshd,则说明ssh服务未启动或未安装。
SSH的基本使用
SSH远程登录
使用密码登录
假设你想使用用户名登录远程主机,只需一条简单的命令就足够了。
$ ssh user@host 例如:ssh pika@
如果本地用户名与远程用户名匹配,则登录时可以省略用户名。
$ ssh 主机❀ SSH 的默认端口是 22,这意味着您的登录请求将发送到远程主机上的端口 22。可以使用 p 参数更改此端口。
$ ssh -p 2222 user@host
上述命令表示 ssh 直接连接远程主机的 2222 端口。
如果首次登录对方主机,系统会显示如下提示:
$ ssh user@host
无法建立主机‘host()’的真实性。
RSA 密钥指纹为 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d。
您确定要继续连接吗(是/否)?
这段话的意思是无法验证宿主的真实性。我们只知道它的公钥指纹。您还想继续连接吗?
所谓“公钥指纹”是指公钥长度较长(这里采用RSA算法,长达1024位),很难比较,所以对其进行MD5计算来转转化为 128 位指纹。在上面的示例中,它是 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d。比较起来会容易很多。
一个自然的问题是用户如何知道远程主机的公钥指纹应该是什么?答案是没有什么好的办法。远程主机必须将公钥指纹发布在其网站上,以便用户可以自行检查。
假设用户权衡风险后决定接受远程主机的公钥。
您确定要继续连接吗(是/否)? yes
系统会提示主机已被识别。
警告:已将“主机”(RSA) 永久添加到已知主机列表中。
然后系统将提示您输入密码。
密码:(输入密码)
密码正确即可登录。
一旦远程主机的公钥被接受,它将存储在 $HOME/.ssh/known_hosts 文件中。下次连接到该主机时,系统会识别出其公钥已存储在本地,跳过警告部分,直接要求您输入密码。
每个 SSH 用户都有自己的known_hosts 文件。另外,系统也有这样一个文件,通常是/etc/ssh/ssh_known_hosts,它存储了一些来自所有用户信任的远程主机的公钥。
使用公钥登录
使用密码登录,每次都需要输入密码,非常麻烦。幸运的是,SSH还提供了公钥登录,可以让你免去输入密码的麻烦。
所谓“公钥登录”原理很简单,就是用户将自己的公钥存储在远程主机上。当您登录时,远程主机会向用户发送一个随机字符串,用户使用自己的私钥对其进行加密,然后将其发回。远程主机使用预先存储的公钥进行解密。如果成功,则证明该用户是值得信赖的,并且具有直接登录 shell 的权限,无需密码。
此方法需要用户提供自己的公钥。如果没有现成的,可以直接使用 ssh-keygen 生成一个:
$ ssh-keygen
运行上述命令后,系统会出现一系列提示,您可以按 Enter all马路。问题之一是是否为私钥设置密码(passphrase)。如果您担心私钥的安全性,可以在这里设置一个。
操作完成后,会在文件夹$HOME/.ssh/: 和 id_rsa 下生成两个新文件。前者是您的公钥,后者是您的私钥。
现在输入以下命令将公钥传输到远程主机:
$ ssh-copy-id user@host
好了,从现在开始您登录时无需输入密码再次进入。 。
如果还不行,请打开远程主机上的 /etc/ssh/sshd_config 文件,检查以下几行前面的“#”注释是否被删除。 1 ?登录后用户主目录中的 $HOME/.ssh/authorized_keys 文件中。公钥只是一个字符串,只需将其添加到authorized_keys文件的末尾即可。
不要使用上面的 ssh-copy-id 命令,而是使用以下命令来解释保存公钥的过程:
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys ' 该命令由几条语句组成,按顺序细分: (1)“$ ssh user@host”,表示登录远程主机; (2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,代表登录后在远程shell上执行的命令: (3)“$ mkdir -p .ssh”的作用是如果。用户主目录下的ssh目录不存在,请创建一个; (4) 'cat >> .ssh/authorized_keys' 写入authorized_keys文件后,公钥登录设置完成。
使用ssh在远程后台不间断运行程序
关闭ssh(关闭终端等)后运行的Linux程序或服务自动停止,如python3 a.py &.
解决方法:使用nohup命令让程序在窗口关闭时继续在后台运行(切换SSH连接)。
nohup python3 a.py &
SSH远程控制
SSH数据传输
SSH不仅可以用于远程主机登录,还可以直接在远程主机上进行操作。
$ ssh bruger@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' 单引号之间的部分表示在远程主机上执行的操作;后面输入Redirect表示数据通过SSH传输到远程主机。
这意味着SSH可以在用户和远程主机之间建立命令和数据传输通道,所以很多事情都可以通过SSH完成。
让我们看几个例子。
【示例1】
将$HOME/src/文件夹下的所有文件复制到远程主机上的$HOME/src/文件夹中。
$ cd && tar czv src |
$ cd && tar czv src | ssh user@host 'tar xz'
【示例2】
将远程主机$HOME/src/目录下的所有文件复制到用户当前目录。
$ ssh user@host 'tar cz src' |
$ ssh user@host 'tar cz src' | tar xzv
[示例3]
检查远程主机是否正在运行进程httpd。 ? Linux下向外部复制文件的命令是cp。但cp只能本地复制,不能跨服务器,而且scp传输是加密的。可能会稍微影响速度。要在两台主机之间复制文件,您必须拥有两台主机的复制执行帐号和操作权限。
scp 命令参数
- -1 强制 scp 命令使用协议 ssh1
- -2 强制 scp 命令使用协议 ssh2
- -4 强制 scp 命令仅使用 IPv4 地址 -6 强制 scp 命令使用 IPv4 地址仅使用 IPv4 寻址 使用 IPv6 寻址
- -B 使用批处理模式(在传输过程中不要求传输密码或短语)
- -C 允许压缩。 (发送 -C 标志到 ssh 以启用压缩)
- -p 保留原始文件的修改时间、访问时间和访问权限。
- -q 不显示传输状态栏。
- -r 递归复制整个文件夹。
- -v 显示详细模式下的输出。 scp 和 ssh(1) 将显示整个进程的调试信息。此信息用于解决连接、身份验证和配置问题。
- -c cipher 使用密码加密数据传输。该选项将直接发送到 ssh。
- -F ssh_config 指定备用ssh配置文件,该参数直接传递给ssh。
- -i Identity_file 从指定文件中读取用于传输的密钥文件。该参数直接发送到ssh。
- -l 限制用户可以使用的带宽(以 Kbit/s 为单位)。
- -o ssh_option 如果习惯使用 ssh_config(5) 中的参数传递方式,
- -P port 注意大写 P,port 是用于指定数据传输的端口号
- -S 程序指定加密传输所使用的程序。该程序必须能够理解 ssh(1) 的功能。
Scp一般有六种使用方式
将远程文件复制到本地:(将远程文件复制到本地)
scp root@www.test.com:/val/test/test.tar.gz / val /test/test.tar.gz
远程复制本地文件:(将本地文件复制到远程主机)
scp /val/test.tar.gz root@www.test.com:/val /test. tar.gz
将远程文件夹复制到本地:(将远程文件夹复制到本地)
scp -r root@www.test.com:/val/test/ /val/test/
远程复制本地文件夹: (复制远程主机的本地文件夹)
scp -r ./ubuntu_env/ root@:/home/pipi
pika:/media/pika/files/machine_learning/datasets$scp -r SocialNetworks /piting@
将远程文件复制到本地指定目录:(复制远程文件到本地)
scp root@www.test.com:/val/test/test.tar.gz /val /test/
远程复制本地文件到指定目录:(复制本地文件到远程主机)
scp /val/test.tar.gz root@www.test.com:/val/
ps: scp 复制文件时,只需指定服务器地址而不添加路径。默认会复制到哪里???采用 SSH 连接来提高安全性。
假设我们希望将8080端口上的数据通过SSH传输到远程主机。命令写法如下:
$ ssh -D 8080 user@host
SSH 会创建一个套接字来监听本地 8080 端口。一旦数据发送到该端口,它就会自动传输到 SSH 连接并发送到远程主机。可以想象,如果8080端口原本是一个未加密的端口,那么现在它就会变成一个加密的端口。
本地端口转发
有时候绑定一个本地端口还不够,还必须指定数据传输的目标主机,这就形成了点对点的“端口转发”。为了与下文中的“远程端口转发”区别,我们将这种情况称为“本地转发”(Localforwarding)。
假设host1为本地主机,host2为远程主机。由于各种原因,两台主机无法连接。然而,还有另一个主机3可以同时连接到前两台主机。因此,自然的想法是通过host3将host1连接到host2。
我们在 host1 上执行以下命令:
$ ssh -L 2121:host2:21 host3
命令中的 L 参数总共接受三个值,分别是“本地端口:目标主机:目标host port" ,用冒号分隔。该命令的含义是指定SSH绑定本地2121端口,然后指定host3将所有数据转发到目标主机host2上的21端口(假设host2运行的是FTP,默认端口为21) ).
这样我们只要连接到host1上的2121端口,就相当于连接到了host2上的21端口。host1和host3之间是否形成了一条用于数据传输的秘密隧道,所以也称为“ SSH隧道”。
这里有一个比较有趣的例子。
$ ssh -L 5900:localhost:5900 host3
意思是把本机的5900端口绑定到host3上的5900端口(这里是localhost指的是host3,因为目标主机是相对于host3的)
另一个例子是通过host3的端口转发通过ssh登录host2。
$ ssh -L 9001:host2:22 host3
此时,只要ssh登录到本机的9001端口,就相当于登录到了host2。
$ ssh -p 9001 localhost
上面的-p参数指定指定的登录端口。
远程端口转发
既然“本地端口转发”是指绑定到本地端口的转发,那么“远程转发”(远程转发)显然就是指绑定到远程端口的转发。
我们继续看上面的例子。 Host1和host2无法连接,必须通过host3转发。然而,出现了一种特殊情况。 Host3 是内部网络机器。它可以连接到外部网络上的host1,但反之则不行。外网host1无法连接内网host3。此时“本地端口转发”就无法使用了。我应该怎么办?
解决方案是,由于主机 3 可以连接到主机 1,因此从主机 3 创建与主机 1 的 SSH 连接,然后在主机 1 上使用该连接。
我们在host3上执行以下命令:
$ ssh -R 2121:host2:21 host1
R参数也接受三个值分别是“远程主机端口:目标主机:目标主机端口” 。该命令的含义是让host1监听自己的2121端口,然后将所有数据通过host3转发到host2上的21端口。由于host1是host3的远程主机,因此这种情况称为“远程端口绑定”。
绑定后,我们就可以从host1建立到host2的连接了:
$ ftp localhost:2121
这里需要指出的是,“远程端口转发”的前提是host1D和host3都拥有一个ssh 客户端。
SSH 的其他参数
SSH 还有一些其他参数也值得介绍。
N参数表示仅连接远程主机,不打开远程shell; T 参数表示未将 TTY 分配给此连接。这两个参数可以一起使用,表示此SSH连接仅用于传输数据,不执行远程操作。
$ ssh -NT -D 8080 主机
f 参数表示 SSH 连接成功后会在后台运行。这样您就可以在本地 shell 中执行其他操作,而无需中断 SSH 连接。
$ ssh -f -D 8080 host
要关闭此后台连接,只能使用kill命令杀死该进程。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网