Sync bash project
This commit is contained in:
161
login-info/install_login-info.sh
Normal file
161
login-info/install_login-info.sh
Normal file
@@ -0,0 +1,161 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
#===============================================================================
|
||||
# login-info 安装脚本
|
||||
# 作用:
|
||||
# 1) 安装命令: /usr/local/bin/login-info
|
||||
# 2) 写入登录启动脚本: /etc/profile.d/smy-login-info.sh
|
||||
#
|
||||
# 用法:
|
||||
# sudo bash login-info/install_login-info.sh
|
||||
# sudo bash login-info/install_login-info.sh --mode full
|
||||
# sudo bash login-info/install_login-info.sh --all
|
||||
#
|
||||
# 禁用(用户级):
|
||||
# touch ~/.login-info-disable
|
||||
# 或: export LOGIN_INFO_DISABLE=1
|
||||
#
|
||||
# 禁用(全局):
|
||||
# sudo mkdir -p /etc/login-info
|
||||
# sudo touch /etc/login-info/disable
|
||||
#===============================================================================
|
||||
|
||||
log() { printf '[login-info-安装] %s\n' "$*" >&2; }
|
||||
fail() { log "错误: $*"; exit 1; }
|
||||
|
||||
require_root() {
|
||||
if [ "${EUID:-$(id -u)}" -ne 0 ]; then
|
||||
fail "请使用 root 权限运行 (sudo bash login-info/install_login-info.sh)"
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
local default_mode="summary"
|
||||
local ssh_only="1"
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--mode)
|
||||
shift
|
||||
[ $# -gt 0 ] || fail "--mode 需要参数: summary|full"
|
||||
default_mode=$1
|
||||
;;
|
||||
--mode=*)
|
||||
default_mode=${1#*=}
|
||||
;;
|
||||
--ssh-only)
|
||||
ssh_only="1"
|
||||
;;
|
||||
--all)
|
||||
ssh_only="0"
|
||||
;;
|
||||
-h|--help)
|
||||
cat <<'EOF'
|
||||
用法:
|
||||
sudo bash login-info/install_login-info.sh [--mode summary|full] [--ssh-only|--all]
|
||||
EOF
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
fail "未知参数: $1"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
case "$default_mode" in
|
||||
summary|full) ;;
|
||||
*) fail "--mode 仅支持: summary|full" ;;
|
||||
esac
|
||||
|
||||
require_root
|
||||
|
||||
local script_dir script_src bin_path profile_hook
|
||||
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
script_src="${script_dir}/login-info.sh"
|
||||
bin_path="/usr/local/bin/login-info"
|
||||
profile_hook="/etc/profile.d/smy-login-info.sh"
|
||||
|
||||
[ -f "$script_src" ] || fail "未找到脚本: $script_src"
|
||||
|
||||
mkdir -p "$(dirname "$bin_path")"
|
||||
mkdir -p "$(dirname "$profile_hook")"
|
||||
|
||||
log "安装命令到: $bin_path"
|
||||
if command -v install >/dev/null 2>&1; then
|
||||
install -m 0755 "$script_src" "$bin_path"
|
||||
else
|
||||
cp "$script_src" "$bin_path"
|
||||
chmod 0755 "$bin_path"
|
||||
fi
|
||||
|
||||
log "写入登录启动脚本: $profile_hook"
|
||||
cat >"$profile_hook" <<EOF
|
||||
# /etc/profile.d/smy-login-info.sh
|
||||
# 由 login-info 安装脚本生成:SSH 登录后自动展示服务器信息
|
||||
#
|
||||
# 禁用:
|
||||
# - export LOGIN_INFO_DISABLE=1
|
||||
# - touch ~/.login-info-disable
|
||||
# - touch /etc/login-info/disable
|
||||
#
|
||||
# 覆盖默认行为:
|
||||
# - export LOGIN_INFO_MODE=summary|full
|
||||
# - export LOGIN_INFO_SSH_ONLY=1|0
|
||||
|
||||
# 仅在交互式且有 TTY 时运行(避免 scp/sftp 等非交互场景)
|
||||
case "\$-" in
|
||||
*i*) ;;
|
||||
*) return 0 2>/dev/null || exit 0 ;;
|
||||
esac
|
||||
|
||||
if ! [ -t 1 ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
|
||||
# 避免重复输出
|
||||
if [ -n "\${LOGIN_INFO_SHOWN:-}" ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
|
||||
# 禁用开关
|
||||
if [ -n "\${LOGIN_INFO_DISABLE:-}" ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
|
||||
if [ -f "/etc/login-info/disable" ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
|
||||
if [ -n "\${HOME:-}" ] && [ -f "\${HOME}/.login-info-disable" ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
|
||||
# SSH-only(默认开启,可通过环境变量覆盖)
|
||||
__smy_login_info_ssh_only="\${LOGIN_INFO_SSH_ONLY:-${ssh_only}}"
|
||||
if [ "\$__smy_login_info_ssh_only" = "1" ]; then
|
||||
if [ -z "\${SSH_CONNECTION:-}" ] && [ -z "\${SSH_TTY:-}" ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
export LOGIN_INFO_SHOWN=1
|
||||
|
||||
__smy_login_info_mode="\${LOGIN_INFO_MODE:-${default_mode}}"
|
||||
if command -v login-info >/dev/null 2>&1; then
|
||||
if [ "\$__smy_login_info_mode" = "full" ]; then
|
||||
login-info --full || true
|
||||
else
|
||||
login-info --summary || true
|
||||
fi
|
||||
fi
|
||||
EOF
|
||||
|
||||
chmod 0644 "$profile_hook"
|
||||
|
||||
log "安装完成"
|
||||
log "提示: 重新登录 SSH 即可看到信息;或手动运行: login-info --full"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user