本文目录导读:

我来为你提供几个不同场景下的SSH密钥自动配置脚本。
通用SSH密钥生成和配置脚本
#!/bin/bash
# SSH密钥自动配置脚本
# 使用方法: ./ssh_key_setup.sh [邮箱地址]
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 默认配置
KEY_TYPE="ed25519"
KEY_COMMENT="${1:-"$(whoami)@$(hostname)"}"
SSH_DIR="$HOME/.ssh"
KEY_PATH="$SSH_DIR/id_${KEY_TYPE}"
# 检查是否已有SSH密钥
check_existing_key() {
if [ -f "$KEY_PATH" ]; then
echo -e "${YELLOW}警告: SSH密钥已存在: $KEY_PATH${NC}"
read -p "是否覆盖?(y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "${GREEN}使用现有密钥${NC}"
return 1
fi
fi
return 0
}
# 创建SSH目录
create_ssh_dir() {
if [ ! -d "$SSH_DIR" ]; then
mkdir -p "$SSH_DIR"
chmod 700 "$SSH_DIR"
echo -e "${GREEN}创建SSH目录: $SSH_DIR${NC}"
fi
}
# 生成SSH密钥
generate_key() {
echo -e "${GREEN}生成SSH密钥...${NC}"
ssh-keygen -t "$KEY_TYPE" -C "$KEY_COMMENT" -f "$KEY_PATH" -N ""
if [ $? -eq 0 ]; then
echo -e "${GREEN}SSH密钥生成成功${NC}"
echo -e "公钥: ${KEY_PATH}.pub"
echo -e "私钥: ${KEY_PATH}"
else
echo -e "${RED}SSH密钥生成失败${NC}"
exit 1
fi
}
# 配置SSH配置文件
configure_ssh_config() {
local config_file="$SSH_DIR/config"
# 创建基础SSH配置
if [ ! -f "$config_file" ]; then
cat > "$config_file" << EOF
# SSH 配置文件
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_${KEY_TYPE}
ServerAliveInterval 60
ServerAliveCountMax 3
StrictHostKeyChecking accept-new
EOF
chmod 600 "$config_file"
echo -e "${GREEN}SSH配置文件创建成功${NC}"
else
echo -e "${YELLOW}SSH配置文件已存在${NC}"
fi
}
# 显示公钥
show_public_key() {
echo -e "\n${GREEN}=== 公钥内容 ===${NC}"
cat "${KEY_PATH}.pub"
echo -e "\n${YELLOW}请将此公钥添加到远程服务的SSH密钥中:${NC}"
echo " - GitHub: Settings -> SSH and GPG keys"
echo " - GitLab: Settings -> SSH Keys"
echo " - 服务器: ~/.ssh/authorized_keys"
}
# 主函数
main() {
echo -e "${GREEN}开始配置SSH密钥...${NC}\n"
create_ssh_dir
if check_existing_key; then
generate_key
fi
configure_ssh_config
show_public_key
echo -e "\n${GREEN}SSH密钥配置完成!${NC}"
# 可选: 测试SSH连接
read -p "是否测试SSH连接?(y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
read -p "请输入测试主机 (默认: github.com): " test_host
test_host=${test_host:-github.com}
echo -e "\n${YELLOW}测试连接到 $test_host ...${NC}"
ssh -T "git@$test_host" 2>/dev/null || true
fi
}
# 运行主函数
main
适用于多服务器的批量配置脚本
#!/bin/bash
# 批量SSH密钥部署脚本
# 使用方法: ./batch_ssh_deploy.sh server_list.txt
SERVER_LIST="${1:-servers.txt}"
SSH_KEY="${HOME}/.ssh/id_ed25519.pub"
# 服务器列表格式 (每行): username@hostname:port
check_requirements() {
if [ ! -f "$SSH_KEY" ]; then
echo "错误: SSH公钥不存在: $SSH_KEY"
echo "请先生成SSH密钥"
exit 1
fi
if [ ! -f "$SERVER_LIST" ]; then
echo "错误: 服务器列表文件不存在: $SERVER_LIST"
exit 1
fi
}
# 部署公钥到单个服务器
deploy_to_server() {
local server="$1"
local username=$(echo "$server" | cut -d'@' -f1)
local host=$(echo "$server" | cut -d'@' -f2 | cut -d':' -f1)
local port=$(echo "$server" | cut -d':' -f2)
port=${port:-22}
echo "部署到 $username@$host:$port ..."
# 使用ssh-copy-id部署公钥
ssh-copy-id -p "$port" -i "$SSH_KEY" "$username@$host" 2>/dev/null
if [ $? -eq 0 ]; then
echo "✓ 成功部署到 $host"
else
echo "✗ 部署失败: $host"
fi
}
# 批量部署
batch_deploy() {
while IFS= read -r server; do
# 跳过注释和空行
[[ "$server" =~ ^#.*$ ]] && continue
[[ -z "$server" ]] && continue
deploy_to_server "$server"
done < "$SERVER_LIST"
}
echo "开始批量部署SSH密钥..."
check_requirements
batch_deploy
echo "批量部署完成!"
自动化测试和验证脚本
#!/bin/bash
# SSH密钥测试和验证脚本
# 检查SSH密钥配置是否正确
echo "=== SSH配置检查 ==="
# 检查SSH目录
echo -n "检查SSH目录: "
if [ -d "$HOME/.ssh" ]; then
echo "✓ 存在"
ls -la "$HOME/.ssh/" | grep -E "^-.*(pub|id_)"
else
echo "✗ 不存在"
fi
# 检查密钥文件
echo -n "检查SSH密钥: "
if [ -f "$HOME/.ssh/id_ed25519" ]; then
echo "✓ 存在 (ed25519)"
elif [ -f "$HOME/.ssh/id_rsa" ]; then
echo "✓ 存在 (RSA)"
else
echo "✗ 不存在"
fi
# 检查公钥
echo -n "检查公钥: "
if [ -f "$HOME/.ssh/id_ed25519.pub" ]; then
echo "✓ 存在"
echo -n "密钥指纹: "
ssh-keygen -lf "$HOME/.ssh/id_ed25519.pub"
elif [ -f "$HOME/.ssh/id_rsa.pub" ]; then
echo "✓ 存在"
echo -n "密钥指纹: "
ssh-keygen -lf "$HOME/.ssh/id_rsa.pub"
else
echo "✗ 不存在"
fi
# 检查权限
echo -n "SSH目录权限: "
if [ "$(stat -c "%a" "$HOME/.ssh")" = "700" ]; then
echo "✓ 正确 (700)"
else
echo "✗ 不正确"
fi
# 检查SSH代理
echo -n "SSH代理运行状态: "
if ssh-add -l &>/dev/null; then
echo "✓ 运行中"
ssh-add -l
else
echo "✗ 未运行或未添加密钥"
fi
# 测试连接
echo -n "测试GitHub连接: "
ssh -T git@github.com 2>&1 | grep -q "successfully"
if [ $? -eq 0 ]; then
echo "✓ 成功"
else
echo "✗ 需要配置"
fi
echo "=== 检查完成 ==="
Windows PowerShell脚本
# Windows SSH密钥配置脚本
# save as: setup-ssh.ps1
# 颜色函数
function Write-Color {
param([string]$Message, [string]$Color)
Write-Host $Message -ForegroundColor $Color
}
# 主函数
function Setup-SSH {
$sshDir = "$env:USERPROFILE\.ssh"
$keyPath = "$sshDir\id_ed25519"
# 创建SSH目录
if (-not (Test-Path $sshDir)) {
New-Item -ItemType Directory -Path $sshDir -Force | Out-Null
Write-Color "创建SSH目录" Green
}
# 检查现有密钥
if (Test-Path "$keyPath") {
Write-Color "SSH密钥已存在" Yellow
$overwrite = Read-Host "是否覆盖? (y/n)"
if ($overwrite -ne "y") {
Write-Color "使用现有密钥" Green
return
}
}
# 生成SSH密钥
Write-Color "生成SSH密钥..." Green
ssh-keygen -t ed25519 -C "$env:USERNAME@$env:COMPUTERNAME" -f $keyPath -N '""'
if ($LASTEXITCODE -eq 0) {
Write-Color "SSH密钥生成成功" Green
# 启动SSH代理
Start-Service ssh-agent -ErrorAction SilentlyContinue
# 添加密钥到代理
ssh-add $keyPath
# 显示公钥
Write-Color "`n公钥内容:" Yellow
Get-Content "$keyPath.pub"
Write-Color "`n请将上述公钥添加到: " Yellow
Write-Color " - GitHub: Settings -> SSH and GPG keys"
Write-Color " - GitLab: Settings -> SSH Keys"
}
}
# 运行设置
Setup-SSH
使用方法
-
Linux/Mac:
# 保存脚本为 setup_ssh.sh chmod +x setup_ssh.sh ./setup_ssh.sh user@example.com
-
Windows:
# 在PowerShell中运行 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser .\setup-ssh.ps1
这些脚本会自动创建SSH密钥、配置权限、设置SSH配置文件,并显示公钥供你添加到远程服务中。