小小白祈祷中...

ssh(Secure Shell)是一个用于远程登录和管理服务器的网络协议和工具。它通过加密的方式提供安全的通信,可以远程登录、执行命令、传输文件等,是系统管理员和开发人员日常工作中非常重要的工具。


ssh 命令的基本语法

1
ssh [选项] [用户@]主机 [命令]
  • 用户:远程主机上的用户名(可选,默认使用本地用户名)。
  • 主机:目标服务器的 IP 地址或主机名。
  • 命令:可选,如果指定,会在远程主机上执行该命令并退出。

基本用法

连接远程服务器

1
ssh user@host
  • 示例

    1
    ssh root@192.168.1.10
    • 连接 IP 为 192.168.1.10 的主机,使用用户名 root
    • 如果未指定用户,则使用当前登录用户。例如:
      1
      ssh 192.168.1.10

指定端口

1
ssh -p [端口号] user@host
  • 默认情况下,ssh 使用端口 22。如果远程服务器使用了非默认端口,可以通过 -p 指定端口号。

  • 示例

    1
    ssh -p 2222 root@192.168.1.10
    • 使用端口 2222 连接远程服务器。

执行远程命令

1
ssh user@host [命令]
  • 直接在远程主机上执行命令,执行完成后退出。

  • 示例

    1
    ssh root@192.168.1.10 "ls -l /var/www"
    • 在远程服务器上列出 /var/www 目录的内容。

使用密钥认证

ssh 支持通过密钥认证方式登录,无需输入密码,安全性更高。

生成 SSH 密钥

1
ssh-keygen -t rsa
  • 按提示保存密钥对。生成的密钥文件默认存储在 ~/.ssh/id_rsa(私钥)和 ~/.ssh/id_rsa.pub(公钥)。

将公钥复制到远程主机

1
ssh-copy-id user@host
  • 示例

    1
    ssh-copy-id root@192.168.1.10
  • 这会将公钥添加到远程主机的 ~/.ssh/authorized_keys 中,之后可以通过密钥登录。

使用密钥登录

1
ssh -i /path/to/private_key user@host
  • 示例
    1
    ssh -i ~/.ssh/id_rsa root@192.168.1.10

端口转发

本地端口转发

将远程服务器的某个端口转发到本地。

1
ssh -L [本地端口]:[目标地址]:[远程端口] user@host
  • 示例

    1
    ssh -L 8080:127.0.0.1:3306 root@192.168.1.10
    • 将本地的 8080 端口映射到远程 192.168.1.103306 端口(通常是 MySQL 服务)。

远程端口转发

将本地的某个端口转发到远程服务器。

1
ssh -R [远程端口]:[目标地址]:[本地端口] user@host
  • 示例

    1
    ssh -R 8080:127.0.0.1:80 root@192.168.1.10
    • 将远程服务器上的 8080 端口映射到本地的 80 端口。

代理转发

允许通过跳板机访问目标服务器。

1
ssh -J user@jump_server user@target_server
  • 示例

    1
    ssh -J user@jumpserver.com root@192.168.1.10
    • 通过 jumpserver.com 跳板服务器连接目标服务器 192.168.1.10

保持连接(防止超时断开)

通过配置 ServerAliveIntervalServerAliveCountMax 参数,防止 SSH 会话因长时间无操作而断开。

1
ssh -o ServerAliveInterval=60 user@host
  • ServerAliveInterval=60:每 60 秒发送一个心跳包。

使用配置文件简化连接

通过修改 ~/.ssh/config 文件,可以为常用的主机设置别名和默认选项,简化连接命令。

编辑配置文件

1
nano ~/.ssh/config

添加以下内容:

1
2
3
4
5
Host myserver
HostName 192.168.1.10
User root
Port 2222
IdentityFile ~/.ssh/id_rsa
  • Host:别名。
  • HostName:目标主机 IP 或域名。
  • User:默认用户名。
  • Port:默认端口。
  • IdentityFile:指定私钥文件。

使用别名连接

1
ssh myserver

复制文件(scprsync

使用 scp

通过 SSH 传输文件。

1
scp /local/path/file user@host:/remote/path/
  • 从本地复制到远程:
    1
    scp file.txt root@192.168.1.10:/var/www/
  • 从远程复制到本地:
    1
    scp root@192.168.1.10:/var/www/file.txt /local/path/

使用 rsync

同步文件或目录,支持断点续传。

1
rsync -avz /local/path/ user@host:/remote/path/
  • 示例
    1
    rsync -avz file.txt root@192.168.1.10:/var/www/

常用选项

选项 功能
-p [端口号] 指定远程主机的端口号(默认是 22)。
-i [私钥路径] 使用指定的私钥文件进行认证。
-L [本地转发] 配置本地端口转发。
-R [远程转发] 配置远程端口转发。
-J [跳板机] 配置跳板机代理转发。
-o [选项] 设置 SSH 配置参数(如 ServerAliveInterval 等)。
-X-Y 启用 X11 图形转发,允许运行远程图形界面程序(需要 X11 环境)。
-C 启用压缩,提高低带宽网络的传输速度。
-f 在后台运行 SSH 会话(常用于端口转发)。
-q 安静模式,不显示任何输出信息。

常见问题与解决

连接超时或拒绝连接

  • 原因

    • 目标主机 SSH 服务未启动。
    • 防火墙阻止了 SSH 端口。
    • 使用了错误的端口号。
  • 解决方法

    • 确认目标主机 SSH 服务是否运行:
      1
      sudo systemctl status ssh
    • 检查防火墙规则:
      1
      sudo ufw allow 22

公钥认证失败

  • 原因

    • 公钥未正确添加到远程主机。
    • 权限问题(~/.ssh 目录或文件权限不正确)。
  • 解决方法

    • 检查公钥是否已复制:
      1
      cat ~/.ssh/authorized_keys
    • 修复权限:
      1
      2
      chmod 700 ~/.ssh
      chmod 600 ~/.ssh/authorized_keys

断开后无法重新连接

  • 原因

    • SSH 会话未正确关闭,导致僵尸会话。
  • 解决方法

    • 在本地清理已知主机的缓存:
      1
      ssh-keygen -R [host]

总结

  • 基本连接ssh user@host
  • 执行远程命令ssh user@host "command"
  • 密钥登录ssh-keygen -> ssh-copy-id
  • 简化配置:使用 ~/.ssh/config
  • 文件传输scprsync

ssh 是一个强大且灵活的工具,熟练掌握它可以极大提升远程管理和协作的效率。