ssh命令

ssh 命令 #

ssh(Secure Shell)是一个用于安全远程登录和执行命令的网络协议。它提供了加密的通信会话,可以在不安全的网络中安全地连接到远程系统。

语法 #

ssh [选项] [用户@]主机 [命令]

常用选项 #

选项 描述
-p 端口 指定连接的端口号(默认为22)
-i 身份文件 指定用于身份验证的私钥文件
-l 用户名 指定登录的用户名
-v 详细模式(可以使用多个v增加详细程度,如-vv或-vvv)
-X 启用X11转发
-Y 启用可信X11转发
-C 启用压缩
-f 在执行命令前将ssh放入后台
-N 不执行远程命令(用于端口转发)
-L [本地地址:]本地端口:远程主机:远程端口 本地端口转发
-R [远程地址:]远程端口:本地主机:本地端口 远程端口转发
-D [本地地址:]本地端口 动态端口转发(SOCKS代理)
-o 选项 指定额外的选项
-q 安静模式,禁止大多数警告和诊断消息
-t 强制分配伪终端

常见用法 #

1. 连接到远程服务器 #

ssh username@hostname

例如:

2. 使用非标准端口连接 #

ssh -p 2222 username@hostname

3. 使用私钥文件连接 #

ssh -i ~/.ssh/id_rsa username@hostname

4. 在远程服务器上执行命令 #

ssh username@hostname command

例如:

ssh [email protected] 'ls -la'

5. 启用X11转发(在远程服务器上运行图形应用程序) #

ssh -X username@hostname

6. 本地端口转发(SSH隧道) #

ssh -L 8080:localhost:80 username@hostname

这会将本地的8080端口转发到远程服务器的80端口。

7. 远程端口转发 #

ssh -R 8080:localhost:80 username@hostname

这会将远程服务器的8080端口转发到本地的80端口。

8. 设置SOCKS代理 #

ssh -D 1080 username@hostname

这会在本地1080端口创建一个SOCKS代理。

9. 保持连接活动(防止超时断开) #

ssh -o ServerAliveInterval=60 username@hostname

10. 禁用主机密钥检查(不推荐用于生产环境) #

ssh -o StrictHostKeyChecking=no username@hostname

SSH配置文件 #

SSH客户端配置文件位于~/.ssh/config,可以简化常用连接的配置:

Host myserver
    HostName example.com
    User username
    Port 2222
    IdentityFile ~/.ssh/id_rsa_example
    ServerAliveInterval 60

使用配置文件后,可以简单地使用:

ssh myserver

SSH密钥管理 #

1. 生成SSH密钥对 #

ssh-keygen -t rsa -b 4096

2. 将公钥复制到远程服务器(启用无密码登录) #

ssh-copy-id username@hostname

或手动添加:

cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

3. 管理SSH代理 #

eval $(ssh-agent)  # 启动SSH代理
ssh-add ~/.ssh/id_rsa  # 添加私钥到代理

高级用法 #

1. 多跳SSH(通过跳板机连接) #

ssh -J user1@jumphost user2@destination

或在配置文件中:

Host destination
    HostName destination.internal
    User user2
    ProxyJump user1@jumphost

2. 使用SSH配置别名 #

~/.bashrc~/.bash_aliases中添加:

alias sshdev='ssh -i ~/.ssh/dev_key user@dev-server'

3. 保持SSH会话(使用screen或tmux) #

ssh user@host -t 'screen -DR mysession'

4. 通过SSH挂载远程文件系统(需要sshfs) #

sshfs user@host:/remote/path /local/mountpoint

5. 通过SSH传输文件(使用scp或rsync) #

scp file.txt user@host:/remote/path/
rsync -avz -e ssh source/ user@host:/remote/path/

安全最佳实践 #

  1. 使用SSH密钥而不是密码认证
  2. 禁用root用户直接SSH登录
  3. 更改默认SSH端口
  4. 使用强密码和强密钥(RSA 4096位或ED25519)
  5. 限制可以使用SSH的用户
  6. 使用防火墙限制SSH访问
  7. 启用两因素认证
  8. 定期更新SSH服务器和客户端
  9. 监控SSH登录尝试
  10. 使用fail2ban阻止暴力破解攻击

常见问题排查 #

连接被拒绝 #

ssh: connect to host example.com port 22: Connection refused

可能的原因:

  • SSH服务未运行
  • 防火墙阻止了连接
  • SSH服务运行在不同的端口

主机密钥验证失败 #

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

可能的原因:

  • 远程服务器已重新安装
  • 中间人攻击(需谨慎)

解决方法:

ssh-keygen -R hostname

权限问题 #

Permissions 0644 for '/home/user/.ssh/id_rsa' are too open.

解决方法:

chmod 600 ~/.ssh/id_rsa

提示 #

  • 使用~/.ssh/config文件可以大大简化SSH连接管理
  • 对于频繁连接的服务器,设置SSH密钥认证可以提高安全性和便利性
  • 使用SSH代理可以避免重复输入密码
  • 对于不稳定的网络连接,使用mosh(mobile shell)可能比SSH更好
  • 使用sshrc可以在连接时自动加载自定义配置
  • 在脚本中使用SSH时,考虑使用-o BatchMode=yes选项避免交互提示