跳转至

Ssh 笔记

Ubuntu 服务端安装 ssh 服务

Bash
1
2
3
4
5
6
7
8
# 安装ssh服务器
sudo apt install openssh-server

# 启动服务
sudo systemctl start sshd

# 让服务开机自动启动
sudo systemctl enable sshd

客户端连接 ssh 服务器

Bash
# 一般连接
ssh example.com

# 指定用户名为 user
ssh user@example.com

# 指定端口号
ssh user@example.com -p 8022

# 指定私钥文件
ssh -i ~/.ssh/id_rsa100 user@example.com

ssh 允许 root 登录

Text Only
# vim /etc/ssh/sshd_config
PermitRootLogin yes

禁用密码登录

Text Only
# vim /etc/ssh/sshd_config
PasswordAuthentication no

使用非对称密钥连接 ssh 服务器

使用 ssh-keygen 命令,会在客户端 ~/.ssh/ 目录下一对秘钥,带 .pub 后缀的是公钥,同名不带 .pub 的是私钥。

查看本机ssh公钥,并修改私钥权限:

Text Only
1
2
3
cat .ssh/id_rsa.pub
# 修改权限为 rw-------
chmod 0600 .ssh/id_rsa

在服务端用户的家目录下创建一个文件,并粘贴客户端的公钥

Bash
1
2
3
touch ~/.ssh/authorized_keys
# 粘贴客户端的 ~/.ssh/id_rsa.pub 内容
vim ~/.ssh/authorized_keys

或者用这种更快捷的添加公钥方式

Bash
1
2
3
4
5
# 在客户端操作
ssh-keygen -t rsa -b 2048

ssh-copy-id user@example.com
# ssh-copy-id -i ~/.ssh/id_rsa.pub user@example.com

用客户端测试连接。

如果连接成功,最好关闭服务端 ssh 的密码验证,只能使用客户端公钥验证登录(更安全)

Bash
1
2
3
4
5
6
7
8
# 打开配置文件
sudo vim /etc/ssh/sshd_config

# PasswordAuthentication,默认值yes改为no
PasswordAuthentication no

# 修改了配置需要重启 ssh 服务
sudo systemctl restart sshd

ssh 经常一段时间就断掉解决办法

Text Only
sudo vim /etc/ssh/sshd_config

# 找到下面两行
# 客户端每隔多少秒向服务发送一个心跳数据
# ClientAliveInterval 0
# 客户端多少秒没有相应,服务器自动断掉连接
# ClientAliveCountMax 3

# 去掉注释,改成
ClientAliveInterval 30
ClientAliveCountMax 86400

# 重启 sshd 服务
sudo systemctl restart sshd

ssh config 配置文件

通过创建 ~/.ssh/config 配置文件,可以方便地在终端使用一行命令连接 ssh 服务器。内容按如下格式编写:

Text Only
Host vmware
      HostName 192.168.50.130
      Port 22
      User ubuntu

Host demo
      HostName example.com
      Port 8022
      User admin
      IdentityFile ~/.ssh/test1/id_rsa

保存文件后,在终端输入 ssh demo 即可直接连接,无需输入密码(公钥认证)。

执行远程命令

参考:How To Run / Execute Command Using SSH

Bash
1
2
3
4
5
6
ssh user1@server1 command1
ssh user1@server1 'command2'
# 管道操作
ssh user1@server1 'command1 | command2'
# 多条命令
ssh admin@box1 "command1; command2; command3"
Bash
1
2
3
4
5
6
7
8
9
ssh -T $_remote <<'EOL'
    now="$(date)"
    name="$HOSTNAME"
    up="$(uptime)"
    echo "Server name is $name"
    echo "Server date and time is $now"
    echo "Server uptime: $up"
    echo "Bye"
EOL

端口转发

转发远端8888端口到本地8888端口

Bash
ssh -L 8888:localhost:8888 ubuntu@192.168.1.100
- 整个 -L 8888:localhost:8888 的意思是:在你的本地计算机上监听端口 8888,将所有通过该端口发送的流量转发到远程计算机(192.168.1.100)的 localhost 的端口 8888。