Skip to content

登陆

ssh

本身是一种网络协议(secure shell)

采用了公钥加密

整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。没有 CA 证书,这种风险叫做中间人攻击。

基本使用

  • ssh [-p port] user@remoteIp [-p pwd] [shellCommand]
    • 默认端口是22

密钥登陆

  • 还可以不通过密码,通过公钥登陆,更加安全可靠,可以避免中间人攻击
bash
ssh-keygen -t ed25519 -f ~/.ssh/my_custom_key -C "your_email@example.com" 
# -t :指定加密算法,建议使用 ed25519,性能好
# -f:指定文件路径,方便为不同的服务生成不同的 key
# -C:添加注释,方便核对是否正确生成(什么都可以,一般邮箱)
# 生成结果:id_rsa.pub 和 id_rsa。前者是你的公钥,后者是你的私钥

ssh-copy-id -i [public_key_file_path] [username]@[hostname or IP address] # 放在目标机器的 `~/.ssh/authorized_keys` 下面,不建议直接 copy 上去,可能出现异常

配置

通过 sshd -T 查询配置 配置文件位置:/etc/ssh/sshd_config 修改后重新加载:systemctl restart sshd(如果不重新加载,不会生效的)

  • ssh配置使用的是 sshd 配置,如果不正确配置,可能出现很多问题
  • 超时连接
    • 查询配置 sshd -T | grep -Ei 'timeout|alive|interval|countmax'
    • clientaliveinterval:最大空闲时间配置
    • clientalivecountmax:允许探活失败最多失败多少次
      • 如果为0,只要达到了clientaliveinterval ,直接断开连接
      • 两者协同即允许通道最长时间 clientalivecountmax * clientaliveinterval 的时间没有数据连接(中间断网了或者怎么样都可以)
    • 因为很多防火墙会有超时时间,如果这段时间没有数据传输,会断连,所以最好将clientaliveinterval调小,将 clientalivecountmax 调大
    • 可以使用如下脚本修改
bash
#!/bin/bash  
  
# Define the SSHD config file  
config_file="/etc/ssh/sshd_config"  
  
# Check if the file exists  
if [ ! -f "$config_file" ]; then  
    echo "Error: $config_file does not exist."    exit 1  
fi  
  
# Create backup filename based on current timestamp  
backup_file="sshd_config.$(date +"%Y%m%d_%H%M%S")"  
cp "$config_file" "/etc/ssh/$backup_file"  # Replace "/path/to/backups/" with your actual backup directory path  
  
# Modify the SSHD 最大空闲时间配置  
if grep -q "^ClientAliveInterval" "$config_file"; then  
    sed -i 's/^ClientAliveInterval.*/ClientAliveInterval 800/' "$config_file"  
else  
    echo -e "\nClientAliveInterval 800" >> "$config_file"  
fi  
  
# -------------------------- 增加修改 ClientAliveCountMax --------------------------target_countmax=3  
if grep -q "^ClientAliveCountMax" "$config_file"; then  
    # 替换现有配置  
    sed -i "s/^ClientAliveCountMax.*/ClientAliveCountMax ${target_countmax}/" "$config_file"  
    echo "已更新 ClientAliveCountMax 为 ${target_countmax}"  
else  
    # 追加新配置  
    echo -e "\nClientAliveCountMax ${target_countmax}" >> "$config_file"  
    echo "已添加 ClientAliveCountMax ${target_countmax}"  
fi  
  
# 执行 sshd -T 命令  
sshd -T  
  
# 检查命令的返回值  
if [ $? -ne 0 ]; then  
    echo "sshd -T 执行异常,退出。"  
    exit 1  
fi  
  
echo "sshd -T 执行成功。"  
  
# Restart SSHD service  
echo "restart sshd"  
systemctl restart sshd  
echo "restart ok"

sftp

  • 登录sftp服务器 sftp -oPort=23 user@remoteIp
bash
# 上传,第一个目录是本机的, 第二个参数远端的    
put /etc/hosts /home/lwl   
# 下载,第一个目录是远端的, 第二个参数是本机的
get /home/lwl /home/csc

scp

  • scp [options] fileSource fileTarge
bash
options 选项参数 | 描述

-P | port:注意是大写的P, port是指定数据传输用到的端口号
-p | 保留原文件的修改时间,小写p,访问时间和访问权限
-r | 递归复制整个目录
-C | 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)

rsync

  • 与其他文件传输工具(如 FTP 或 scp)不同,和 scp 功能类似。rsync 的最大特点是会检查发送方和接收方已有的文件
bash
rsync -r source destination

rz、sz

  • 用 ssh 管理 linux 服务器时经常需要远程与 win 本地之间交互文件。直接用SecureCRT自带的上传下载功能无疑是最方便的。上传:rz、下载:sz
  • 在 window 上使用SecureCRT、XShell 软件,用 rz、sz 进行上传下载
bash
# 上传文件到linux;弹出SecureCRT上传窗口,用SecureCRT来上传
rz    
# 下载文件到客户端(window)
sz filename

正在精进