登陆
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的时间没有数据连接(中间断网了或者怎么样都可以)
- 如果为0,只要达到了
- 因为很多防火墙会有超时时间,如果这段时间没有数据传输,会断连,所以最好将
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/cscscp
- 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 destinationrz、sz
- 用 ssh 管理 linux 服务器时经常需要远程与 win 本地之间交互文件。直接用SecureCRT自带的上传下载功能无疑是最方便的。上传:rz、下载:sz
- 在 window 上使用SecureCRT、XShell 软件,用 rz、sz 进行上传下载
bash
# 上传文件到linux;弹出SecureCRT上传窗口,用SecureCRT来上传
rz
# 下载文件到客户端(window)
sz filename