盒子
盒子

SSH命令的简单使用

SSH(Secure Shell)是建立在应用层和传输层基础上的一种安全协议,主要用于远程登录会话和为其他网络服务提供安全性的协议。它的有点主要是对所有传输的数据加密,且传输的数据可以是压缩的。SSH的功能即可以替代Telnet,也可以为FTP、POP等提供安全通道。

由于自己有VPS,以前公司的服务器也有过维护,所以对SSH还算了解一些。主要用做远程登录,另外也有用过SSH提供的安全通道实现科学上网。在UNIX/Linux系的系统中,通常都有内置SSH的实现。Windows下自己用过比较简单的putty,在做服务器的维护时主要是用Xshell

##密码登录

经常远程登录,使用最多的命令为:

1
ssh user@host

当然如果本地用户名与远程登录的用户名相同,那更简单:

1
ssh host

上述命令省略了端口号,因为默认SSH端口号为22。指定端口号登录:

1
ssh -p port user@host

如果是第一次登录远程计算机,则会提示:

The authenticity of host ‘[101.226.241.185]:11717 ([101.226.241.185]:11717)’ can’t be established.

RSA key fingerprint is 8d:94:86:b7:97:c0:2f:85:36:97:d3:1f:66:a2:b7:82.

Are you sure you want to continue connecting (yes/no)?
大致是说远程主机的真实性无法确认,只知道公钥的签名是后面那一串,询问是否继续。如果确认便会在用户目录的.ssh目录下的known_hosts文件添加公钥,内容包含了远程主机的地址和公钥串。如果登录不同的主机,都会在这个文件分别添加公钥。登录完成之后就像在本地操作一样了。

##免密码登录

上面登录都需要是用密码,SSH也可以面密码登录。面密码登录也就是使用公钥认证,原理涉及到现代密码学的问题。首先在本地生成私钥:

1
ssh-keygen -b 1024 -t dsa

参数-b指定了公钥的长度,-t dsa表示生成公有和私有的密钥对,可以使用-t rsa生车功能一个密钥。da默认长度1024bit,rsa默认长度2048bit,因此可以不使用参数-b指定长度。另可以是用-f name指定密钥的名字。

在生成的过程中,会有很多提示包括需要存放的地址、是否是用密码短句等需要确认。其中密码短句表示如果有人拿到私钥,没有密码短句也没法使用,一般还是设置比较好。

完了之后需要复制公钥到远程主机,又可使用命令:

1
ssh-copy-id -i ~/.ssh/id_dsa.pub

这样就完成了公钥认证。但是如果在生成密钥时加了密码短语,那么需要在登录时需要输入密码短语对密钥解密,这样还是没有完成免密码登录。不过可以使用SSH代理,它可以帮记住密码短语。OpenSSH是SSH协议的实现,UNIX/Linux系的系统默认都是安装的这个,这个实现里默认也包含了SSH的代理ssh-agent。

直接运行ssh-agent命令会输出它使用的环境和变量,用到这些变量需要使用eval:

1
eval 'ssh-agent'

上述实际就是运行了代理,添加到环境变量里,这样启动shell时就会自动运行:

1
echo 'eval `ssh-agent`' >> ~/.bash_profile

其中引号第一对是单引号,第二对是MacBook键盘1左边的那个按键。ssh-agent运行之后需要知道密钥对在哪儿,因此还需要做一步。使用:

1
ssh-add ~/.ssh/id_agent

接着输入密码短句,现在就可以免密码且密钥是安全的。

##另一种使用
SSH登录到远程主机之后就可以操作了,但还有另一种方式,不用登录远程主机而直接在本地远程操作。例如想查看远程主机有没有运行nginx,直接使用:

1
user@host 'ps -ax | grep nginx'

这样就不用登录远程主机,而像在本地操作一样,但事实上操作的远程主机。

支持一下
扫一扫,支持forsigner