From 3a8ead6971edc93ac45b15407b695b84ba6aceca Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 24 Sep 2025 15:29:58 +0800 Subject: [PATCH] . --- set_ssh_without_password.sh | 98 +++++++++++++++++++++++++++++++++++++ test_mpi_all.sh | 20 ++++++++ 2 files changed, 118 insertions(+) create mode 100644 set_ssh_without_password.sh create mode 100644 test_mpi_all.sh diff --git a/set_ssh_without_password.sh b/set_ssh_without_password.sh new file mode 100644 index 0000000..bbe4624 --- /dev/null +++ b/set_ssh_without_password.sh @@ -0,0 +1,98 @@ +test@tn01:~$ cat setup_ssh_nopass.sh +#!/usr/bin/env bash +set -Eeuo pipefail + +usage() { + cat <<'USAGE' +用法: + setup_ssh_nopass.sh [-u 远端用户] [-p 端口] [-k 私钥路径] 主机 + 或者: + setup_ssh_nopass.sh 用户@主机 [-p 端口] [-k 私钥路径] + +示例: + setup_ssh_nopass.sh -u root -p 22 192.168.1.10 + setup_ssh_nopass.sh alice@server.example.com +USAGE +} + +REMOTE_USER="${USER}" +PORT=22 +KEY_PATH="${HOME}/.ssh/id_ed25519" + +# 解析形如 user@host 的参数 +parse_user_host() { + local s="$1" + if [[ "$s" == *"@"* ]]; then + REMOTE_USER="${s%@*}" + HOST="${s#*@}" + else + HOST="$s" + fi +} + +# 参数 +while getopts ":u:p:k:h" opt; do + case "$opt" in + u) REMOTE_USER="$OPTARG" ;; + p) PORT="$OPTARG" ;; + k) KEY_PATH="$OPTARG" ;; + h) usage; exit 0 ;; + \?) echo "未知选项: -$OPTARG" >&2; usage; exit 2 ;; + :) echo "选项 -$OPTARG 需要参数" >&2; usage; exit 2 ;; + esac +done +shift $((OPTIND-1)) +[[ $# -ge 1 ]] || { usage; exit 2; } + +parse_user_host "$1" + +# 生成密钥(若不存在) +if [[ ! -f "$KEY_PATH" ]]; then + mkdir -p "$(dirname "$KEY_PATH")" + ssh-keygen -t ed25519 -a 100 -N "" \ + -C "${USER}@$(hostname -f 2>/dev/null || hostname)-$(date +%Y%m%d)" \ + -f "$KEY_PATH" +fi +chmod 600 "$KEY_PATH" || true + +PUB_KEY_CONTENT="$(cat "${KEY_PATH}.pub")" +PUB_KEY_B64="$(base64 -w0 2>/dev/null < "${KEY_PATH}.pub" || base64 < "${KEY_PATH}.pub" | tr -d '\n')" + +# 可选:预先抓取远端主机指纹,避免交互确认(注意:生产环境请先核对指纹!) +mkdir -p "${HOME}/.ssh" +touch "${HOME}/.ssh/known_hosts" +if command -v ssh-keyscan >/dev/null 2>&1; then + ssh-keyscan -p "$PORT" -H "$HOST" >> "${HOME}/.ssh/known_hosts" 2>/dev/null || true +fi + +# 把公钥追加到远端 authorized_keys(去重、修权限、SELinux 兼容) +ssh -p "$PORT" "${REMOTE_USER}@${HOST}" bash -s <<'REMOTE' "$PUB_KEY_B64" +set -Eeuo pipefail +PUB_B64="$1" +umask 077 +mkdir -p "$HOME/.ssh" +touch "$HOME/.ssh/authorized_keys" +chmod 700 "$HOME/.ssh" +chmod 600 "$HOME/.ssh/authorized_keys" + +# 解码公钥并去重追加 +PUB_DEC="$(printf '%s' "$PUB_B64" | (base64 -d 2>/dev/null || openssl base64 -d))" +if ! grep -qxF "$PUB_DEC" "$HOME/.ssh/authorized_keys"; then + printf '%s\n' "$PUB_DEC" >> "$HOME/.ssh/authorized_keys" +fi + +# SELinux 环境修复上下文(如有) +command -v restorecon >/dev/null 2>&1 && restorecon -R "$HOME/.ssh" || true +REMOTE + +# 自检免密是否生效 +if ssh -p "$PORT" -o BatchMode=yes -o PasswordAuthentication=no \ + "${REMOTE_USER}@${HOST}" 'echo OK' 2>/dev/null | grep -qx 'OK'; then + echo "✅ 已配置免密:${REMOTE_USER}@${HOST}(端口 ${PORT}) 使用密钥 ${KEY_PATH}" +else + echo "⚠️ 看起来免密未生效。请检查远端 /etc/ssh/sshd_config 中的以下项:" + echo " PubkeyAuthentication yes" + echo " AuthorizedKeysFile .ssh/authorized_keys" + echo " (如果远端禁止密码登录,首次安装密钥需用其他方式复制过去)" + exit 1 +fi diff --git a/test_mpi_all.sh b/test_mpi_all.sh new file mode 100644 index 0000000..1e1151a --- /dev/null +++ b/test_mpi_all.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +NODES=(tn01 tn02 tn03 tn04 tn05 tn06) +OSU=/home/test/osu-micro-benchmarks-7.5.1/build/c/mpi/pt2pt/standard/osu_bw + +for ((i=0; i<${#NODES[@]}; i++)); do + for ((j=i+1; j<${#NODES[@]}; j++)); do + A=${NODES[$i]} + B=${NODES[$j]} + echo "▶ Testing $A <-> $B" + mpirun --bind-to none \ + --mca pml ucx \ + --mca osc ucx \ + --mca btl ^tcp,sm,vader \ + --mca ucx_net_devices mlx4_0:1 \ + -np 2 -H $A,$B \ + $OSU + echo "" + done +done