正文开始@Assassin
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在非安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。SSH最常见的用途是远程登录系统,通常利用SSH来使用命令行界面和远程执行命令。SSH使用频率最高的场合是类Unix系统,但是Windows操作系统也能有限度地使用SSH。2015年,微软宣布将在未来的操作系统中提供原生SSH协议支持,win10 已基本提供OpenSSH工具。
在设计上,ssh
是telnet
和非安全shell
的替代品。telnet
,Berkeley rlogin
,rsh
及rexec
等协议采用明文传输,使用不可靠的密码,容易遭到监听、嗅探和中间人攻击。ssh
旨在保证非安全网络环境中的信息加密完整且可靠。
在linux系统上ssh是极为常用的工具,通过 ssh client
可以连接到运行了 ssh server
的远程服务器上。 ssh client
的基本使用方法是:
远程登录服务器:
ssh user@hostname -p port
实际上“ -p port ”
不是很常用,ssh的端口号默认为22,如果需要登录到某一特定端口时才需要使用到 -p 选项:
ssh [email protected]
默认端口号为22,输入passwd后便可远程登录到我的云服务器:
注: 如果事先没有安装过ssh,需先安装openssh-server
在使用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
Path | Permission |
---|---|
.ssh directory (code) | 0700 (drwx------) |
private keys (ex: id_rsa ) (code) |
0600 (-rw-------) |
config |
0600 (-rw-------) |
public keys (*.pub ex: id_rsa.pub ) |
0644 (-rw-r–r–) |
authorized_keys (code) |
0644 (-rw-r–r–) |
known_hosts |
0644 (-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 修改文件的掩码
要实现免密登录的前提是得生成ssh密钥,密钥分为公钥和私钥。
基本操作是:
创建密钥的方式是:
[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
目录下会多出两个文件:
之后就是第二步操作:拷贝公钥。基本想法是:想免密登录到哪个服务器,就将公钥拷贝给哪个服务器即可。
例如想免密登录server服务器。则只需将公钥中的内容复制到server中的~/.ssh/authorized_keys
文件里即可。(没有authorized_keys
可自行创建)
不过要使远端服务器记住公钥,更为简单的方法是直接执行指令:ssh-copy-id user@hostname -p port
,该指令会一键添加公钥到远端服务器的~/.ssh/authorized_keys
文件中:
现在从当前服务器远程登录到server服务器无需验证密码:
自然,在server服务器也生成了~/.ssh/authorized_keys
文件,其中的内容便是对应的公钥:
ssh可以实现跨主机远程执行命令,命令格式:
[Assassin@Ninghai ~]$ ssh user@hostname 'command'
在本地主机执行远端服务器的指令,对于长命令或者命令列表需要用单引号括起来:
scp用于主机之间的远程传输文件,scp 是 secure copy 的缩写,是linux系统下基于ssh登录进行安全的远程文件拷贝命令。
命令格式:
scp file user@hostname:path
将本主机下的文件复制到远端主机的path路径下。
也可一次拷贝多个文件:
scp file1 file2 user@hostname:path
拷贝文件夹:
scp -rf dir user@hostname:path