SSH 相关操作

启用 SSH 并使用 root 账户登录

虽说通过应用的形式在 Windows 10 上体验 Linux 是一个不赖的选择,但很多时候使用 Windows 内置的 CMD 或者 PowerShell 来操作 Linux 依旧有着很多不习惯。

而最为关键的是当需要对文件进行操作时,使用交互命令远不如使用 SFTP 来的更为「简单粗暴」。因此只要通过配置 SSH 远程登录,就可以像管理远程服务器那样来操作这个 Linux 系统了。

首先,因为 Ubuntu 系统限制,所以我们需要可以为 root 用户设置新密码,这里输入:

1
sudo passwd root

配置好之后,未来使用 SSH 客户端或者 SFTP 客户端登录系统时,我们就可以直接使用 root 权限进行登录。

使用 cp 命令将 SSH 相关配置文件进行备份:

1
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

之后使用 vim 编辑器编辑 sshd_config 文件:

1
sudo vim /etc/ssh/sshd_config

编辑并调整以下设置项:

1
2
3
4
5
Port 22
ListenAddress 0.0.0.0
PermitRootLogin yes # 修改成 yes
#StrictModes yes #注释掉这一行
PasswordAuthentication yes # 原来是 no,改成 yes

然后输入命令:

1
systemctl restart sshd

启动 SSH

如果要从其他电脑连接,记得防火墙放行端口 22

错误处理

如果出现以下错误,可以通过 ssh-keygen 自动产生缺少的 key

1
2
3
4
* Stopping OpenBSD Secure Shell server sshd [ OK ] 
* Starting OpenBSD Secure Shell server sshd Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

修复方法

执行

1
sudo ssh-keygen -A

重启 ssh 服务

1
2
3
[email protected]:~$ sudo service ssh --full-restart
* Stopping OpenBSD Secure Shell server sshd [ OK ]
* Starting OpenBSD Secure Shell server sshd [ OK ]

设置免密登录

通常来说,启动 root 登录,并使用密码进行连接不仅不安全,而且连接需要输入密码,这里描述如何使用更安全的免密登录。

STEP 1:在本地生成公钥和私钥对

1
2
3
4
# RSA 算法,长度 4096(默认为 2048)
ssh-keygen -t rsa -b 4096 -f [FILE_NAME] -C [USERNAME]
# ED25519 算法
ssh-keygen -t ed25519 -f [FILE_NAME] -C [USERNAME]

一路回车,都设置为默认值,即在本地生成了公钥和私钥,设置 passphrase(更安全,但是每次连接前需要输入密码),存储在当前目录下(如果不使用 -f 参数,则会默认生成在~/.ssh/ 目录下)

1
2
3
4
5
6
> .ssh tree -a
.
├── authorized_keys
├── id_rsa
├── id_rsa.pub
└── known_hosts

其中:

  • id_rsa 是默认生成的私钥
  • id_rsa.pub 是默认生成的公钥
  • authorized_keys 文件存放其他主机的公钥,其他主机即可 ssh 登录该机
  • know_hosts 记录主机登陆过的其他主机的公钥信息。

STEP 2:把公钥加入到服务器的 authorized_keys 文件中

使用 ssh-copy-id 命令,ssh-copy-id 命令可以把本地主机的公钥复制到远程主机的 authorized_keys 文件上,ssh-copy-id 命令也会给远程主机的用户主目录中 ~/.ssh/authorized_keys 设置合适的权限。

把本地的 ssh 公钥文件安装到远程主机对应的账户下:

1
2
3
4
5
ssh-copy-id [email protected]
# 或
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] # 指定公钥路径
# 或
ssh-copy-id -i ~/.ssh/id_rsa.pub -p xxx [email protected] # 当端口号非默认的22时,使用此命令,xxx处为指定端口号

可选步骤:配置本地 config 文件

在本地机器的目录 ~/.ssh 下找到 config 文件,按如下进行配置:

1
2
3
4
5
Host xxx                  # xxx:一个服务器昵称
HostName xx.xx.xx.xx # 目的机器的ip
User username # ssh登陆时候的用户名
Port 22 # ssh所使用的端口,默认是22
IdentityFile /Users/morooi/.ssh/vultr # 对应服务器公钥的本地私钥文件路径

以后只要 ssh xxx 便可登陆服务器啦~

SCP 命令

scp 命令可用于 linux/macOS 之间复制文件和目录。
scp 是 secure copy 的缩写,scp 是 linux/macOS 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的

从本地复制到远程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 指定了用户名,命令执行后需要再输入密码,仅指定了远程的目录,文件名字不变
scp local_file [email protected]_ip:remote_folder

# 指定了用户名,命令执行后需要再输入密码,指定了文件名
scp local_file [email protected]_ip:remote_file

# 没有指定用户名,命令执行后需要输入用户名和密码,仅指定了远程的目录,文件名字不变
scp local_file remote_ip:remote_folder

# 没有指定用户名,命令执行后需要输入用户名和密码,指定了文件名
scp local_file remote_ip:remote_file

# 复制目录,将local_folder复制到remote_folder下
scp -r local_folder [email protected]_ip:remote_folder
scp -r local_folder remote_ip:remote_folder

# 实例
scp ~/Downloads/paper.pdf [email protected]:~/Downloads
scp ~/Downloads/paper.pdf [email protected]:~/Downloads/paper.pdf
scp ~/Downloads/paper.pdf 192.168.1.1:~/Downloads
scp ~/Downloads/paper.pdf 192.168.1.1:~/Downloads/paper.pdf

scp -r ~/Downloads/papercode [email protected]:~/Downloads/
scp -r ~/Downloads/papercode 192.168.1.1:~/Downloads/

从远程复制到本地

1
2
3
4
5
# 只要将从本地复制到远程的命令的后2个参数调换顺序即可,如下
scp [email protected]:~/Downloads ~/Downloads/paper.pdf
scp -r [email protected]:~/Downloads/ ~/Downloads/papercode

# 可使用-p指定端口
作者

SJ Zhou

发布于

2019-08-01

更新于

2021-01-06

许可协议

评论