SSH 使用入门¶
此入门仅介绍一些作者认为必要且实用的功能,完善的帮助手册可以通过命令,man ssh_config
, man ssh
查看
为便于说明,假设需要登陆的远程服务器IP为123.45.67.89,SSH 端口为 7696,用户名为kmr。
学习目标¶
- 使用SSH登录服务器/集群
- 使用SCP进行文件传输
可选目标¶
- 使用ssh config文件进行SSH登录管理
- 学会用跳板机进行SSH登录
创建密钥对¶
Warning
新人必学
ssh
是用来安全进行登录远程电脑的命令。使用后,有两种选择来验证登录
- 使用密码
- 使用密钥
第一种方法已经为大众所熟知,但是不安全。因此我们采用密钥进行登录。
使用如下命令生成密钥:
ssh-keygen
根据终端的提示进行操作(实际上你可能只需要不停按enter
键)。默认情况下你会在~/.ssh
目录中得到id_rsa
和id_rsa.pub
文件,他们分别是私钥和公钥。创建好了之后请把id_rsa.pub
文件给服务器管理员。
Warning
私钥是登录集群的钥匙,请务必保管好这个文件,防止自己的电脑被入侵
使用SSH登录服务器¶
Warning
新人必学
若远程服务器已经放置了公钥,则可输入以下命令登陆服务器:
ssh -i <path to your private key> -p <port number> username@server_ip
示例,假设密钥在本地的路径为 ~/.ssh/id_rsa
:
ssh -i ~/.ssh/id_rsa -p 7696 kmr@123.45.67.89
-p
后指定的是端口。若省略不写,默认通过 22 端口与远程服务器进行连接。
默认情况下,id_rsa
和id_rsa.pub
文件位于~/.ssh
下,则-i
选项及其对应参数可以省略。
Warning
计算集群只允许在校园网特定IP范围内直接登陆使用。
使用SCP进行文件传输¶
SCP实际上是SSH+FTP的结合,如果配置好了SSH命令,可以使用以下命令来进行文件传输:
scp myserver:remote_file local_directory_path
scp local_directory_path myserver:remote_file
比如需要把上文提到的远程服务器的文件/data/home/kmr/file
传到本地 /some/local/place
目录下,
则使用命令:
scp -P 7696 kmr@123.45.67.89:/data/home/kmr/file /some/local/place
从本地上传到远程则交换顺序:
scp -P 7696 /some/local/place/file kmr@123.45.67.89:/data/home/kmr/
Warning
注意 scp 指定端口的命令是大写的-P
而非小写的 -p
,这是不同于 ssh 命令的一点。
若所传文件为目录,则需要使用-r
选项:
scp -r -P 7696 kmr@123.45.67.89:/data/home/kmr/directory /some/local/place
Tip
注意 scp
本身可以看作一个特殊的 ssh
命令,因此无论从远程还是本地传输文件都应在本地运行,只是参数的顺序决定了传输的方向。如果两个参数均写本地路径,则与 cp
命令的行为相近,但不可均写远程路径。
zsh下 (比如macOS >=10.15版本的默认终端),不能直接使用通配符*
批量传输文件,需要将包含*
的字符串用单引号括起。
可选:通过配置 config 优雅地的使用 SSH¶
为了避免每次都输入一大串命令。 请使用vim编辑如下文件:
vim ~/.ssh/config
注意
请注意修改该文件权限为 600
(即 -rw-------
),否则可能导致无法并行。
类似地,如发现自己的任务交上去只能在一个节点上运行,也请检查 ~/.ssh
下各个文件的权限,注意只有公钥是 644
权限。
我们可以把SSH命令的参数都储存在这个文件里。以下是语法示例文件:
Host myserver # (1)!
User kmr # (2)!
Hostname 123.45.67.89 # (3)!
Port 7696 # (4)!
IdentityFile ~/.ssh/id_rsa # (5)!
- nickname for your cluster
- replacement of username in ssh
- replace of cluster_ip in ssh
- replacement of
-p <port number>
in ssh - replace of
-i <path to your private key>
in ssh
保存上述文件,你就可以简单地使用如下命令登录:
ssh myserver
此命令即相当于上文提到的ssh -i ~/.ssh/id_rsa -p 7696 kmr@123.45.67.89
。
同样的,scp
命令也可以使用上面的Host
名来代替,例如:
scp myserver:/data/home/kmr/file /some/local/place
scp
效果!如果需要传递目录,同样需要加入-r
参数。
加深理解¶
Warning
该视频仅帮助理解SSH原理以及基本操作,视频中含有本笔记未要求的内容,但是大部分普通用户没有权限执行。
在本地电脑显示服务器图像 (X11 Forwarding)¶
使用终端登录服务器后没办法直接显示图形界面。有时候在*服务器*上使用画图软件时,可以通过X11 Forwarding功能将图像显示到本地电脑上。只需要在命令里加上-X
或者-Y
:
ssh -X -i <para.> -p <para.> username@server_ip
在config文件中配置X11 Forwarding*¶
Host <hostnickname>
ForwardX11 yes # (1)!
ForwardX11Trusted yes # (2)!
- equivalent to
-X
- equivalent to
-Y
(This option valid only if your ForwardX11 is set to yes!)
使用跳板机/代理进行远程登录¶
本组的服务器限制了登录的ip,即你只能在学校ip范围内进行登录。同时由于登录需要密钥,而密钥保存在办公室电脑上,因此登录就必须使用办公室电脑。因此,人不在办公室时就很难登录服务器。
解决方法就是,先在校园网环境下通过SSH登录到办公室电脑(仅自己的用户名密码即可),再通过办公室电脑登录到服务器。此时办公室电脑是作为*跳板*来使用的:
ssh username@proxy
ssh -p port_number -i key_file username@cluster191
在config文件中配置跳板机*¶
打开 ~/.ssh/config
,复制以下代码(注意去掉注释,否则可能会报错):
# nickname you set for your office computer
Host proxy
# username you set for login
User robinzhuang
# IP address of your office computer, change the xxx to real one!
Hostname 10.24.3.xxx
# nickname for your cluster
Host myserver
# username you set, change to real one!
User kmr
# IP for cluster, change to real one!
Hostname 123.45.67.89
# the key file location used in login
IdentityFile ~/.ssh/id_rsa
# specify the port number, replace xx with real port!
Port xx
# use Host proxy as Jump Server
ProxyJump proxy
我们可以发现其实是直接登录课题组服务器的一些改进,我们首先配置了从这台电脑登录到跳板机的命令,然后再配置利用跳板机到服务器的命令。
如果上述的
ProxyJump proxy
不起作用,可将其替换为ProxyCommand ssh -o 'ForwardAgent yes' proxy "ssh-add ~/.ssh/id_rsa && nc %h %p"
,请用你的密钥的路径来代替上述的~/.ssh/id_rsa
部分。
完成以上配置后可以使用如下命令直接配置:
ssh myserver
在config文件中转发端口*¶
有时,我们在服务器上部署了 jupyter notebook
等服务时,需要把远程的某个端口 (以下例子中为 8888
端口) 转发到本地的某个端口 (以下例子中为 9999
端口),使得在本地访问 https://localhost:9999
时也能访问远程的 jupyter notebook
服务。
Host myserver # (1)!
User kmr # (2)!
Hostname 123.45.67.89 # (3)!
LocalForward 9999 localhost:8888 # (4)!
- 为你的服务器取一个任意的昵称
- 请修改为真实的用户名
- 请修改为真实的IP
localhost:8888
是相对于远端服务器的真实IP和端口,若不是localhost
,请替换为对应的IP和端口号
在使用跳板机的情况下使用X11 Forwarding¶
只需要在 ~/.ssh/config
中加入
Host * # (1)!
ForwardX11Trusted yes
- 对任意配置生效
一份示例配置文件(config)¶
以下为 ~/.ssh/config
的一个示例,需要时可在这份示例文件上进行修改,必要修改的部分已在注释中标出,General config
可以直接照抄。注意须删掉文件中所有的注释。
# General config
Host *
ForwardX11Trusted yes
ForwardAgent yes
AddKeysToAgent yes
ServerAliveInterval 60
ControlPersist yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
# set proxy
# nickname for your Jump Server
Host nickname_proxy
# IP for Jump Server (REPlACE IT!)
Hostname 10.24.3.255
# your username for Jump Server (REPlACE IT!)
User chenglab
# Host1 and host2
# nickname for your cluster
Host nickname_1
Hostname 123.45.67.89
# your host1 username (REPlACE IT!)
User kmr1
LocalForward 8051 localhost:8888
# nickname for your cluster
Host nickname_2
Hostname 123.45.67.90
# your host2 username (REPlACE IT!)
User kmr2
LocalForward 8052 localhost:8888
# set same parts for host1 and host2
# use your own nickname
Host nickname_1 nickname_2
Port 7696
# use your own nickname
ProxyJump nickname_proxy
超纲的部分*¶
在配置文件中实现类似选择语句的功能,以下例子描述的是当网络环境随时变更时,连接同一台机器可能会需要访问不同IP时所采取的策略。
此例子不建议初学者直接复制粘贴,其中需要替换的部分请根据具体应用场景来自行斟酌
Host elements
User chenglab
Match host elements exec "nc -G 4 -z 10.24.3.144 %p"
# Private net IP
Hostname 10.24.3.144
Match host elements
# Public net IP
Hostname xxx.xxx.xxx.xxx
Port 6000
常见问题¶
ssh private key are too open¶
The error message is
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/me/.ssh/id_rsa_targethost' are too open.
It is recommended that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /home/me/.ssh/id_rsa_targethost
This arises from the permission of your private key:id_rsa
file.
Use command ls -l
to see your id_rsa
permission. if it is not -rw-------
, you should change it to that! Use the following command:
chmod 600 ~/.ssh/id_rsa
No xauth data; using fake authentication data for X11 forwarding.¶
The error message is
Warning: No xauth data; using fake authentication data for X11 forwarding.
This is because ssh
can't find your xauth location. Usually, the location is in /opt/X11/bin/xauth
. Add this in your ssh configure file:
Host *
XAuthLocation /opt/X11/bin/xauth
Remote host identification has changed!¶
When the remote host was just repaired, the error like below might be raised.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
51:82:00:1c:7e:6f:ac:ac:de:f1:53:08:1c:7d:55:68.
Please contact your system administrator.
Add correct host key in /Users/isaacalves/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/isaacalves/.ssh/known_hosts:12
RSA host key for 104.131.16.158 has changed and you have requested strict checking.
Host key verification failed.
Take it easy, and just edit your /Users/isaacalves/.ssh/known_hosts
file to remove the line with the IP address of the very remote host. For some users such as Ubuntu or Debian users, ssh -R xxx
might be necessary, which would be shown in the error info.
However, if not any repair or upgrade happened, man-in-the-middle attack might happen. Just stop logging in and contact manager of cluster at once to make sure.