远程登录工具ssh && 跨主机远程拷贝scp

正文开始@Assassin

1. ssh简介:

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在非安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。SSH最常见的用途是远程登录系统,通常利用SSH来使用命令行界面和远程执行命令。SSH使用频率最高的场合是类Unix系统,但是Windows操作系统也能有限度地使用SSH。2015年,微软宣布将在未来的操作系统中提供原生SSH协议支持,win10 已基本提供OpenSSH工具。

在设计上,sshtelnet和非安全shell的替代品。telnetBerkeley rloginrshrexec等协议采用明文传输,使用不可靠的密码,容易遭到监听、嗅探和中间人攻击ssh旨在保证非安全网络环境中的信息加密完整且可靠。

2. ssh基本用法:

在linux系统上ssh是极为常用的工具,通过 ssh client 可以连接到运行了 ssh server 的远程服务器上。 ssh client 的基本使用方法是:
远程登录服务器:

ssh user@hostname -p port
  • user:用户名
  • hostname:ip地址/域名
  • port:端口号,默认是22

实际上“ -p port ”不是很常用,ssh的端口号默认为22,如果需要登录到某一特定端口时才需要使用到 -p 选项:

ssh Assassin@114.55.55.152

默认端口号为22,输入passwd后便可远程登录到我的云服务器:
注: 如果事先没有安装过ssh,需先安装openssh-server
在这里插入图片描述

3. 配置别名登录:

在使用ssh进行远程登录时,格式为ssh user@hostname -p port,这样写起来相对来说比较不友好,毕竟hostname一般来说是一串点分十进制的四字节字符串。可以通过配置别名的方式来曲线登录,在~/.ssh/config文件中添加格式如下表:提前指定Host别名,将ip地址,用户名及端口号(不填默认为22)填到对应的位置即可。

如果家目录下没有.ssh的话可以自行创建一个,同理.ssh中没有config也是自己创建。可以同时设置多个别名:

Host myserver1
	HostName IP地址/域名
    User 用户名
    Port 端口号

Host myserver2
    HostName IP地址/域名
    User 用户名
    Port 端口号

保存退出后即可使用指定的别名登录到指定服务器的指定用户,like this:
在这里插入图片描述
由于没有其他云服务器了,这里姑且就直接用当前服务器的root用户来试验了
可以看到是使用了server别名来进行远程登录的,还是比较高效的。
在这里插入图片描述
ps:刚刚在配置了~.ssh/config保存退出后执行ssh + 别名登录,发现竟然报错了,错误信息是Bad owner or permissions on ~/.ssh/config,意思是提示:错误的所有者或权限,查阅了一番资料后解决了这个问题。在执行ssh操作时可能会出现文件夹或者文件没有生效的情况,也就是无效的权限,可能需要遵循以下的权限表:

因为我的.ssh文件夹中没有config文件,所以由普通用户创建的config文件的权限为664,而根据权限表,config文件的权限应该是600

PathPermission
.ssh directory (code)0700 (drwx------)
private keys (ex: id_rsa) (code)0600 (-rw-------)
config0600 (-rw-------)
public keys (*.pub ex: id_rsa.pub)0644 (-rw-r–r–)
authorized_keys (code)0644 (-rw-r–r–)
known_hosts0644 (-rw-r–r–)

这里的config文件可能是需要仅所有者的rw权限,也就是600,解决方法自然是:

[Assassin@Ninghai .ssh]$ sudo chmod 600 config

在这里插入图片描述
至于为什么会出现这种情况,我个人觉得应该是.ssh文件夹对于所属组及others没有进入的x权限,自然也就不允许文件夹里面的文件对于非所有者用户也任何权限了,因为.ssh文件夹非所有者用户都进不去,就没有必要谈对文件夹中的文件有r权限了。了解的大神请issue!!


补充:
普通用户创建文件夹的权限是775,普通文件的权限是664 ;
root用户创建文件夹的权限是755,普通文件的权限是644 ;
这是由于umask的不同。具体原因请见:权限管理的 5.4 修改文件的掩码


4. 免密登录:

要实现免密登录的前提是得生成ssh密钥,密钥分为公钥和私钥。
基本操作是:

  • 在自己的服务器上生成一对ssh key(如果已经存在可以不生成)
  • 拷贝公钥到远端的服务器上

创建密钥的方式是:

[Assassin@Ninghai ~]$ ssh-keygen -t rsa

不加任何选项的ssh-keygen也可生成密钥,不加任何选项默认是以rsa算法生成密钥。

执行 ssh-keygen 即可生成ssh密钥,一路回车即可。
在这里插入图片描述
生成的信息如下:大概的意思是说生成的公钥放在了 ~/.ssh/id_rsa.pub,私钥放在了 ~/.ssh/id_rsa

Your identification has been saved in /home/Assassin/.ssh/id_rsa.
Your public key has been saved in /home/Assassin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:IZa/qbYS+MUW8Xy5RbtZtra/dShXija2kA0fWKjqI7U Assassin@Ninghai
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|      ..   ..    |
|      ++. .o..   |
|     ..oooooo o  |
|   . . .S.oo.= ..|
|  . . =. o.=ooo+ |
|   . =..o o O.+.o|
|    +.E.   + =. o|
|     ++o    .  oo|
+----[SHA256]-----+

执行结束后,~/.ssh目录下会多出两个文件:

  • id_rsa:私钥
  • id_rsa.pub:公钥

在这里插入图片描述可以使用cat指令查看公私钥内容。


之后就是第二步操作:拷贝公钥。基本想法是:想免密登录到哪个服务器,就将公钥拷贝给哪个服务器即可。

例如想免密登录server服务器。则只需将公钥中的内容复制到server中的~/.ssh/authorized_keys文件里即可。(没有authorized_keys可自行创建)

不过要使远端服务器记住公钥,更为简单的方法是直接执行指令:ssh-copy-id user@hostname -p port,该指令会一键添加公钥到远端服务器的~/.ssh/authorized_keys文件中:
在这里插入图片描述
现在从当前服务器远程登录到server服务器无需验证密码:
在这里插入图片描述
自然,在server服务器也生成了~/.ssh/authorized_keys文件,其中的内容便是对应的公钥:
在这里插入图片描述

5. 远程执行命令:

ssh可以实现跨主机远程执行命令,命令格式:

[Assassin@Ninghai ~]$ ssh user@hostname 'command'

在本地主机执行远端服务器的指令,对于长命令或者命令列表需要用单引号括起来:
在这里插入图片描述

6. scp跨主机远程拷贝:

scp用于主机之间的远程传输文件,scp 是 secure copy 的缩写,是linux系统下基于ssh登录进行安全的远程文件拷贝命令。

命令格式:

scp file user@hostname:path

将本主机下的文件复制到远端主机的path路径下。

也可一次拷贝多个文件:

scp file1 file2 user@hostname:path

拷贝文件夹:

scp -rf dir user@hostname:path

具体操作:
在这里插入图片描述
over~

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐