Linux 系统 SSH 服务

1. 概念

SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络中安全地远程登录和执行命令。它取代了早期的明文传输协议(如 Telnet、FTP、rlogin),提供强大的加密和身份验证机制,防止数据被窃听或篡改。

注意点:用ssh或者与scp相关的命令时,会产生登录shell加载下面相关配置文件,切记这些配置文件中不能有任何会产生输出的指令(如 echo 等)。

# 系统级配置
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc 
 
# 用户级配置
~/.bash_profile
~/.bashrc


# 原因分析
# 当你运行scp命令复制文件时,scp会启动一次ssh会话,然后在这个会话中发送一些精确的命令以读取远程主机上指定路径的文件内容。如果此时echo命令在bashrc中被触发,并把一些额外的输出写入到ssh会话中,scp就无法正确地解析它期望的文件内容了,从而导致命令失败。
 
# 在正常情况下,你应该避免在bashrc文件中添加会生成输出的命令,以避免干扰scp或其他依赖ssh的命令的执行。如果你确实需要在bashrc文件中添加echo或类似的命令,一个比较好的做法可能是检查当前会话是否为一个交互式会话,只在交互式会话中执行这些命令。你可以参考以下的bash语句:
if [ "$PS1" ]; then
  echo "This is an interactive session."
fi
# 在这个例子中,$PS1环境变量通常在交互式bash会话中被设置,所以你可以使用它来检测当前会话是否为交互式。类似的,你可以把你的echo命令放在这样的条件判断语句中,以避免在非交互式会话(比如scp和ssh命令)中执行它们。
Bash

2. SSH 基本用法

2.1. 远程登录

ssh username@hostname      # 使用密码登录(默认端口 22)
ssh -p 2222 user@host     # 指定端口,-p(小写)
ssh root@192.168.1.100    # 登录特定 IP
Bash

2.2. 文件传输

scp 命令语法:

# 推送文件到远程目录
scp rewriteip.sh root@172.16.1.31:/tmp/
 
# 推送目录到远端服务器
scp -r /etc root@172.16.1.31:/tmp/
 
# 注意:
# 与rsync不同,推送时不论加 / 或者不加,推送的都是目录
# 如果想推送目录下的文件加 *
scp -r /etc/* root@172.16.1.31:/tmp/
 
# 命令解析:
# rewriteip.sh 要推送的文件或目录
# root 远程主机上的系统用户
# @ 分隔符
# 172.16.1.31 远端主机的IP地址
# :/tmp/ 远端主机保存文件的位置

# 拉取远程服务器文件到本地
scp root@172.16.1.31:/tmp/rewriteip.sh /tmp/
Bash

scp 命令常用参数:

# -P(大写) 指定端口,默认22端口可不写
# -r 表示递归拷贝目录
# -p 表示在拷贝文件前后保持文件或目录属性不变
# -l 限制传输使用带宽(默认kb)
 
# 将本地/tmp目录下文件推送至远端服务器10.0.0.61的/tmp目录,使用对端的root用户
scp -P22 -rp /tmp/* root@10.0.0.61:/tmp/
 
# 将远程10.0.0.61服务器/tmp目录下文件拉取到本地/tmp目录
scp -P22 -rp root@10.0.0.61:/tmp/* /tmp/
Bash

sftp 命令语法:

# SFTP(交互式文件传输),连接远程服务器
sftp user@host

# 下载文件
sftp> get [远程文件] [本地路径]  # 下载单个文件
sftp> get -r [远程目录] [本地路径]  # 递归下载整个目录
# 上传文件
sftp> put [本地文件] [远程路径]  # 上传单个文件
sftp> put -r [本地目录] [远程路径]  # 递归上传整个目录

# 删除文件
rm [远程文件]       # 删除文件
rmdir [远程目录]    # 删除空目录

# 查看/切换目录
pwd              # 查看远程当前目录
lpwd             # 查看本地当前目录
cd [远程目录]     # 切换远程目录
lcd [本地目录]    # 切换本地目录
ls               # 列出远程目录文件
lls              # 列出本地目录文件
# 在命令前面加一个l ,表示 localhost 操作本地服务器
Bash

2.3. 配置远程秘钥登录

# 生成密钥对(默认存放在 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub)
ssh-keygen -t rsa -b 4096 
# -t rsa:指定密钥类型
# -b 4096:指定密钥长度(RSA 专用)

# 将公钥上传到服务器
## 手动复制
## 在远程服务器创建文件,将公钥粘贴进去
mkdir .ssh
vim .ssh/authorized_keys
## 设置权限
chmod 700 .ssh/
chmod 600 .ssh/authorized_keys
 
## 命令推送公钥
ssh-copy-id user@hostname

# 登录时自动使用私钥认证
ssh user@hostname
Bash

2.4. 免交互 sshpass 命令

# 安装
yum install -y sshpass

# 基本用法
sshpass -p 123456 ssh root@10.0.0.51
 
# 参数详解
# -p:指定密码
# -f:从文件中取密码
# -e:从环境变量中取密码
# -P:设置密码提示
Bash

为多台服务器批量设置秘钥登录:

# 配置ip地址
declare -A servers=(
    ["balancer"]="192.168.2.101"
    ["web-01"]="192.168.2.102"
    ["web-02"]="192.168.2.103"
    ["web-03"]="192.168.2.104"
    ["mysql-server"]="192.168.2.105"
    ["files-server"]="192.168.2.106"
)

# 生成免密秘钥对
ssh-keygen -f /root/.ssh/id_rsa -N ""

# 推送公钥并关闭防火墙
server_password="123456"
yum install sshpass -y
for server in "${servers[@]}"
do
    sshpass -p "$server_password" ssh-copy-id -o StrictHostKeyChecking=no root@${server}
    ssh root@${server} << ENDSSH
setenforce 0
systemctl stop firewalld
iptables -F
ENDSSH

done 
Bash

3. SSH 安全优化

SSH作为远程连接服务,通常我们需要考虑到该服务的安全,所以需要对该服务进行安全方面的配置。

常见优化内容:

# SSH 服务器配置文件通常位于 /etc/ssh/sshd_config
Port 2222                       # 修改默认端口(减少暴力破解)
PermitRootLogin no              # 禁止 root 直接登录
PasswordAuthentication no       # 禁用密码登录(仅允许公钥)
AllowUsers alice bob            # 只允许特定用户登录
UseDNS                  no      # 禁止ssh进行dns反向解析,影响ssh连接效率
GSSAPIAuthentication    no      # 禁止GSS认证,减少连接时产生的延迟
Bash
上一篇
下一篇