菜鸟科技网

SSH命令有哪些核心安全用法?

下面我将从基础到高级,系统地介绍 ssh 命令的用法。

SSH命令有哪些核心安全用法?-图1
(图片来源网络,侵删)

核心语法与基本用法

ssh 命令的基本语法结构如下:

ssh [用户名@]主机名 [命令]
  • [用户名@]:可选,如果不指定,默认使用你当前本地的用户名。
  • 主机名:必需,可以是 IP 地址或域名。
  • [命令]:可选,如果指定,ssh 会在远程主机上执行该命令后立即退出,如果不指定,ssh 会启动一个交互式 shell。

最常用的基本命令

远程登录到服务器

这是最常见的用法,它会打开一个远程终端,让你像坐在电脑前一样操作远程服务器。

# 使用当前本地用户名登录
ssh user@example.com
# 指定用户名登录
ssh root@192.168.1.100

执行后,系统会提示你输入该用户的密码,输入密码(输入时不会显示任何字符)并按回车,即可登录。

在远程主机上执行单条命令

如果你只想在远程服务器上运行一个命令并获取结果,而不想进入交互式 shell,可以这样操作:

SSH命令有哪些核心安全用法?-图2
(图片来源网络,侵删)
# 在 example.com 上查看磁盘使用情况
ssh user@example.com 'df -h'
# 在 example.com 上创建一个文件
ssh user@example.com 'touch /tmp/remote_file.txt'

注意:命令部分通常用单引号 括起来,这样可以防止本地 shell 对其进行解释。


更安全高效的认证方式:SSH 密钥

每次都输入密码很麻烦,也不够安全,推荐使用SSH 密钥对进行认证,这是一种更安全、更便捷的方式。

生成 SSH 密钥对

在你的本地机器上执行此命令,如果已经存在,可以跳过。

# -t 指定密钥类型,ed25519 是目前推荐的高效安全的类型
# -C 添加一个注释,通常是你的邮箱,方便识别
ssh-keygen -t ed25519 -C "your_email@example.com"

执行后,会提示你选择保存密钥的位置(直接回车使用默认的 ~/.ssh/id_ed25519)和设置一个可选的密码短语(passphrase),设置密码短语可以为你的私钥再增加一层保护。

SSH命令有哪些核心安全用法?-图3
(图片来源网络,侵删)

完成后,你会在 ~/.ssh/ 目录下找到两个文件:

  • id_ed25519私钥,必须严格保密,绝对不要泄露给任何人!
  • id_ed25519.pub公钥,可以安全地分享给任何人或任何服务。

将公钥复制到远程服务器

你需要将公钥 (id_ed25519.pub) 的内容添加到远程服务器的 ~/.ssh/authorized_keys 文件中,有几种方法:

使用 ssh-copy-id 命令(最简单)

# 将你的公钥复制到 user@example.com 的 authorized_keys 文件中
ssh-copy-id user@example.com

这个命令会自动处理权限设置,非常方便。

手动复制

ssh-copy-id 不可用,你可以手动操作:

  1. 在本地机器上查看并复制公钥内容:

    cat ~/.ssh/id_ed25519.pub
  2. 登录到远程服务器(使用密码):

    ssh user@example.com
  3. 在远程服务器上,确保 .ssh 目录存在并设置正确权限,然后将公钥内容追加到 authorized_keys 文件中:

    # 进入 .ssh 目录
    cd ~/.ssh
    # 设置目录权限(非常重要!)
    chmod 700 .
    # 设置文件权限(非常重要!)
    chmod 600 authorized_keys
    # 复制粘贴公钥内容到文件末尾
    echo "粘贴你的公钥内容到这里" >> authorized_keys

设置完成后,下次你登录时,ssh 就会自动使用你的私钥进行认证,而不再需要输入密码。


常用的高级选项与技巧

指定 SSH 私钥文件

如果你有多个私钥,或者私钥不在默认位置,可以使用 -i 选项指定:

ssh -i /path/to/your/private_key.pem user@example.com

(这在 AWS 等云服务中非常常见,.pem 文件就是私钥。)

指定非标准的 SSH 端口

默认情况下,SSH 使用 22 端口,如果服务器修改了端口,使用 -p 选项:

ssh -p 2222 user@example.com

调试连接问题

当连接出现问题时,-v (verbose) 选项非常有用,它会打印出详细的连接过程信息。

ssh -v user@example.com
# 更详细的调试信息
ssh -vvv user@example.com

在后台执行命令(nohup

当你通过 ssh 在远程服务器上启动一个长时间运行的任务时,如果关闭本地终端,任务也会被中断,可以使用 nohup (No Hang Up) 来解决这个问题:

# nohup 表示不挂断,& 表示在后台运行
ssh user@example.com 'nohup long_running_command > output.log 2>&1 &'
  • nohup:让进程忽略挂断信号。
  • > output.log:将标准输出重定向到 output.log 文件。
  • 2>&1:将标准错误也重定向到标准输出。
  • &:让命令在后台运行。

通过 SSH 安全地传输文件

虽然 scpsftp 是专门的文件传输工具,但它们底层都使用 SSH 协议,因此同样是安全的。

使用 scp (Secure Copy)

# 从本地复制到远程
scp /path/to/local_file.txt user@example.com:/path/to/remote_directory/
# 从远程复制到本地
scp user@example.com:/path/to/remote_file.txt /path/to/local_directory/
# 复制整个目录(需要加 -r 递归选项)
scp -r /path/to/local_dir/ user@example.com:/path/to/remote_dir/

使用 sftp (Interactive File Transfer)

sftp 提供了一个类似 FTP 的交互式命令行界面。

sftp user@example.com
# 登录后,可以使用以下命令:
ls                 # 列出文件
cd /path/to/dir    # 切换目录
get remote_file    # 下载文件
put local_file     # 上传文件
exit               # 退出

配置文件 (~/.ssh/config)

为了避免每次都输入长长的命令,你可以编辑 ~/.ssh/config 文件来创建别名,这是提升效率的神器!

# 编辑配置文件
nano ~/.ssh/config

示例配置:

# 为我的个人服务器设置一个别名
Host myserver
    HostName 203.0.113.10
    User john
    Port 2222
    IdentityFile ~/.ssh/id_ed25519_personal
    # 可选:每次连接都要求输入私钥的密码短语
    # AddKeysToAgent yes
# 为我的 AWS 服务器设置一个别名
Host aws-prod
    HostName ec2-123-45-67-89.compute-1.amazonaws.com
    User ec2-user
    IdentityFile ~/.ssh/aws_key.pem

配置完成后,你就可以用简单的别名来连接了:

ssh myserver
ssh aws-prod

安全最佳实践

  1. 始终使用密钥认证:比密码认证安全得多。
  2. 为私钥设置密码短语:即使私钥泄露,没有密码短语也无法使用。
  3. 禁用密码登录(在服务器上):在服务器的 SSH 配置文件 (/etc/ssh/sshd_config) 中,设置 PasswordAuthentication no,然后重启 SSH 服务,这能极大增强服务器安全性,防止暴力破解。
  4. 使用非标准端口:将默认的 22 端口改为其他高端口,可以减少自动扫描攻击。
  5. 定期更新 SSH 软件:保持系统和 OpenSSH 包为最新版本,以修复已知的安全漏洞。

希望这份详细的指南能帮助你全面掌握 ssh 命令!

分享:
扫描分享到社交APP
上一篇
下一篇