From 40f657568ac5bf96e3edaf6ab8b2cc260ce3643a Mon Sep 17 00:00:00 2001 From: Gettler <62047213+Gettler-Main@users.noreply.github.com> Date: Sat, 7 Feb 2026 23:50:37 +0800 Subject: [PATCH] init --- .bashrc | 108 +++++ .tmux.conf | 90 ++++ .viminfo | 978 ++++++++++++++++++++++++++++++++++++++ .vimrc | 242 ++++++++++ init.sh | 1315 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 2733 insertions(+) create mode 100644 .bashrc create mode 100644 .tmux.conf create mode 100644 .viminfo create mode 100644 .vimrc create mode 100644 init.sh diff --git a/.bashrc b/.bashrc new file mode 100644 index 0000000..9875921 --- /dev/null +++ b/.bashrc @@ -0,0 +1,108 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +# don't put duplicate lines in the history. See bash(1) for more options +# ... or force ignoredups and ignorespace +HISTCONTROL=ignoredups:ignorespace + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# some more ls aliases +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then +# . /etc/bash_completion +#fi + +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm +[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion + +source ~/.nvm/nvm.sh +export PATH="$HOME/.pyenv/bin:$PATH" +eval "$(pyenv init -)" +eval "$(pyenv virtualenv-init -)" diff --git a/.tmux.conf b/.tmux.conf new file mode 100644 index 0000000..90f3d34 --- /dev/null +++ b/.tmux.conf @@ -0,0 +1,90 @@ +set-option -g status-keys vi +setw -g mode-keys vi + +setw -g monitor-activity on + +# setw -g c0-change-trigger 10 +# setw -g c0-change-interval 100 + +# setw -g c0-change-interval 50 +# setw -g c0-change-trigger 75 + + +set-window-option -g automatic-rename on +set-option -g set-titles on +set -g history-limit 100000 + +#set-window-option -g utf8 on + +# set command prefix +set-option -g prefix C-a +unbind-key C-b +bind-key C-a send-prefix + +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R + +bind -n M-Left select-pane -L +bind -n M-Right select-pane -R +bind -n M-Up select-pane -U +bind -n M-Down select-pane -D + +bind < resize-pane -L 7 +bind > resize-pane -R 7 +bind - resize-pane -D 7 +bind + resize-pane -U 7 + + +bind-key -n M-l next-window +bind-key -n M-h previous-window + + + +set -g status-interval 1 +# status bar +set -g status-bg black +set -g status-fg blue + + +#set -g status-utf8 on +set -g status-justify centre +set -g status-bg default +set -g status-left " #[fg=green]#S@#H #[default]" +set -g status-left-length 20 + + +# mouse support +# for tmux 2.1 +# set -g mouse-utf8 on +set -g mouse on +# +# for previous version +#set -g mode-mouse on +#set -g mouse-resize-pane on +#set -g mouse-select-pane on +#set -g mouse-select-window on + + +#set -g status-right-length 25 +set -g status-right "#[fg=green]%H:%M:%S #[fg=magenta]%a %m-%d #[default]" + +# fix for tmux 1.9 +bind '"' split-window -vc "#{pane_current_path}" +bind '%' split-window -hc "#{pane_current_path}" +bind 'c' new-window -c "#{pane_current_path}" + +# run-shell "powerline-daemon -q" + +# vim: ft=conf + +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'tmux-plugins/tmux-resurrect' +set -g @plugin 'tmux-plugins/tmux-continuum' +set -g @continuum-save-interval '15' +set -g @continuum-restore 'on' +set -g @resurrect-capture-pane-contents 'on' + +run -b '~/.tmux/plugins/tpm/tpm' + diff --git a/.viminfo b/.viminfo new file mode 100644 index 0000000..770cec3 --- /dev/null +++ b/.viminfo @@ -0,0 +1,978 @@ +# This viminfo file was generated by Vim 8.1. +# You may edit it if you're careful! + +# Viminfo version +|1,4 + +# Value of 'encoding' when this file was written +*encoding=utf-8 + + +# hlsearch on (H) or off (h): +~h +# Last Search Pattern: +~MSle0~/timeout + +# Last Substitute String: +$ + +# Command Line History (newest to oldest): +:wq +|2,0,1756955151,,"wq" +:q +|2,0,1736486454,,"q" +:21 +|2,0,1730727245,,"21" +:q! +|2,0,1730296676,,"q!" +:Q +|2,0,1730294337,,"Q" +:w +|2,0,1730249768,,"w" +: +|2,0,1730103988,,"" +:WQ +|2,0,1717468157,,"WQ" +:1 +|2,0,1715828643,,"1" + +# Search String History (newest to oldest): +?/timeout +|2,1,1735020419,47,"timeout" +?/file +|2,1,1735020003,47,"file" +?/8025 +|2,1,1730250065,47,"8025" +? @$ +|2,1,1730249191,,"@$" +?/vars(step3 output.material +|2,1,1729665486,47,"vars(step3 output.material" +?/10.168 +|2,1,1729658344,47,"10.168" +?/custo +|2,1,1729082006,47,"custo" +?/ui +|2,1,1729081467,47,"ui" +?/exe +|2,1,1726733698,47,"exe" +?/server +|2,1,1726733693,47,"server" +?/nas-ser +|2,1,1726733689,47,"nas-ser" +?/usr/bin/env python +|2,1,1726731725,47,"usr/bin/env python" +?/10. +|2,1,1723781164,47,"10." +?/debug +|2,1,1723166793,47,"debug" +?/STATIC_R +|2,1,1723165687,47,"STATIC_R" +?/static +|2,1,1723165647,47,"static" +?/tag +|2,1,1716425173,47,"tag" +?/password +|2,1,1715415355,47,"password" +?/listen +|2,1,1715063153,47,"listen" +?/go +|2,1,1714985225,47,"go" +?/goo +|2,1,1714985221,47,"goo" + +# Expression History (newest to oldest): + +# Input Line History (newest to oldest): + +# Debug Line History (newest to oldest): + +# Registers: +"0 LINE 0 + '硬卧', +|3,0,0,1,1,0,1730249191," '硬卧'," +""1 LINE 0 + FILE_LIMIT=314572800 +|3,1,1,1,1,0,1735020449,"FILE_LIMIT=314572800" +"2 LINE 0 + +|3,0,2,1,1,0,1730727306,"" +"3 LINE 0 + # frp日志配置 + +|3,0,3,1,2,0,1730727305,"# frp日志配置","" +"4 LINE 0 + log_max_days = 3 +|3,0,4,1,1,0,1730727283,"log_max_days = 3" +"5 LINE 0 + log_level = "info" +|3,0,5,1,1,0,1730727282,"log_level = \"info\"" +"6 LINE 0 + log_file = "/var/log/frps.log" +|3,0,6,1,1,0,1730727282,"log_file = \"/var/log/frps.log\"" +"7 LINE 0 + bindPort = 7000 +|3,0,7,1,1,0,1730726655,"bindPort = 7000" +"8 LINE 0 + # cookieStore.set('username', res.data) +|3,0,8,1,1,0,1729665264,"# cookieStore.set('username', res.data)" +"9 LINE 0 + # cookieStore.set('username', res.data) +|3,0,9,1,1,0,1729665264,"# cookieStore.set('username', res.data)" +"w CHAR 0 + ::w +|3,0,32,0,1,0,1730103982,"::w" +"- CHAR 0 + 3 +|3,0,36,0,1,0,1730249295,"3" + +# File marks: +'0 50 12 /home/rustdesk/docker-compose.yml +|4,48,50,12,1756955151,"/home/rustdesk/docker-compose.yml" +'1 10 25 /home/Mahjong/run.sh +|4,49,10,25,1736486454,"/home/Mahjong/run.sh" +'2 22 0 /home/chat/tailchat/docker-compose.env +|4,50,22,0,1735023219,"/home/chat/tailchat/docker-compose.env" +'3 29 0 /home/chat/tailchat/docker-compose.env +|4,51,29,0,1735020016,"/home/chat/tailchat/docker-compose.env" +'4 30 0 /home/chat/tailchat/docker-compose.env +|4,52,30,0,1735020016,"/home/chat/tailchat/docker-compose.env" +'5 12 104 /home/chat/tailchat/docker-compose.yml +|4,53,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +'6 172 12 /home/efplctp/efplctp/efplctp/settings.py +|4,54,172,12,1731395606,"/home/efplctp/efplctp/efplctp/settings.py" +'7 28 0 /home/Mahjong/run.sh +|4,55,28,0,1731045442,"/home/Mahjong/run.sh" +'8 28 0 /home/Mahjong/run.sh +|4,56,28,0,1731045442,"/home/Mahjong/run.sh" +'9 30 19 /home/chat/tailchat/docker-compose.env +|4,57,30,19,1730855168,"/home/chat/tailchat/docker-compose.env" + +# Jumplist (newest first): +-' 50 12 /home/rustdesk/docker-compose.yml +|4,39,50,12,1756955151,"/home/rustdesk/docker-compose.yml" +-' 1 0 /home/rustdesk/docker-compose.yml +|4,39,1,0,1756955139,"/home/rustdesk/docker-compose.yml" +-' 10 25 /home/Mahjong/run.sh +|4,39,10,25,1736486454,"/home/Mahjong/run.sh" +-' 10 25 /home/Mahjong/run.sh +|4,39,10,25,1736486454,"/home/Mahjong/run.sh" +-' 28 0 /home/Mahjong/run.sh +|4,39,28,0,1736486444,"/home/Mahjong/run.sh" +-' 28 0 /home/Mahjong/run.sh +|4,39,28,0,1736486444,"/home/Mahjong/run.sh" +-' 22 0 /home/chat/tailchat/docker-compose.env +|4,39,22,0,1735023219,"/home/chat/tailchat/docker-compose.env" +-' 22 0 /home/chat/tailchat/docker-compose.env +|4,39,22,0,1735023219,"/home/chat/tailchat/docker-compose.env" +-' 22 0 /home/chat/tailchat/docker-compose.env +|4,39,22,0,1735023219,"/home/chat/tailchat/docker-compose.env" +-' 22 0 /home/chat/tailchat/docker-compose.env +|4,39,22,0,1735023219,"/home/chat/tailchat/docker-compose.env" +-' 29 0 /home/chat/tailchat/docker-compose.env +|4,39,29,0,1735020416,"/home/chat/tailchat/docker-compose.env" +-' 29 0 /home/chat/tailchat/docker-compose.env +|4,39,29,0,1735020416,"/home/chat/tailchat/docker-compose.env" +-' 29 0 /home/chat/tailchat/docker-compose.env +|4,39,29,0,1735020416,"/home/chat/tailchat/docker-compose.env" +-' 29 0 /home/chat/tailchat/docker-compose.env +|4,39,29,0,1735020416,"/home/chat/tailchat/docker-compose.env" +-' 30 0 /home/chat/tailchat/docker-compose.env +|4,39,30,0,1735020016,"/home/chat/tailchat/docker-compose.env" +-' 30 0 /home/chat/tailchat/docker-compose.env +|4,39,30,0,1735020016,"/home/chat/tailchat/docker-compose.env" +-' 30 0 /home/chat/tailchat/docker-compose.env +|4,39,30,0,1735020016,"/home/chat/tailchat/docker-compose.env" +-' 30 0 /home/chat/tailchat/docker-compose.env +|4,39,30,0,1735020016,"/home/chat/tailchat/docker-compose.env" +-' 13 0 /home/chat/tailchat/docker-compose.env +|4,39,13,0,1735020014,"/home/chat/tailchat/docker-compose.env" +-' 14 0 /home/chat/tailchat/docker-compose.env +|4,39,14,0,1735020014,"/home/chat/tailchat/docker-compose.env" +-' 13 0 /home/chat/tailchat/docker-compose.env +|4,39,13,0,1735020014,"/home/chat/tailchat/docker-compose.env" +-' 14 0 /home/chat/tailchat/docker-compose.env +|4,39,14,0,1735020014,"/home/chat/tailchat/docker-compose.env" +-' 13 0 /home/chat/tailchat/docker-compose.env +|4,39,13,0,1735020014,"/home/chat/tailchat/docker-compose.env" +-' 14 0 /home/chat/tailchat/docker-compose.env +|4,39,14,0,1735020014,"/home/chat/tailchat/docker-compose.env" +-' 13 0 /home/chat/tailchat/docker-compose.env +|4,39,13,0,1735020014,"/home/chat/tailchat/docker-compose.env" +-' 14 0 /home/chat/tailchat/docker-compose.env +|4,39,14,0,1735020014,"/home/chat/tailchat/docker-compose.env" +-' 30 19 /home/chat/tailchat/docker-compose.env +|4,39,30,19,1735020003,"/home/chat/tailchat/docker-compose.env" +-' 31 19 /home/chat/tailchat/docker-compose.env +|4,39,31,19,1735020003,"/home/chat/tailchat/docker-compose.env" +-' 30 19 /home/chat/tailchat/docker-compose.env +|4,39,30,19,1735020003,"/home/chat/tailchat/docker-compose.env" +-' 31 19 /home/chat/tailchat/docker-compose.env +|4,39,31,19,1735020003,"/home/chat/tailchat/docker-compose.env" +-' 30 19 /home/chat/tailchat/docker-compose.env +|4,39,30,19,1735020003,"/home/chat/tailchat/docker-compose.env" +-' 31 19 /home/chat/tailchat/docker-compose.env +|4,39,31,19,1735020003,"/home/chat/tailchat/docker-compose.env" +-' 30 19 /home/chat/tailchat/docker-compose.env +|4,39,30,19,1735020003,"/home/chat/tailchat/docker-compose.env" +-' 31 19 /home/chat/tailchat/docker-compose.env +|4,39,31,19,1735020003,"/home/chat/tailchat/docker-compose.env" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 12 104 /home/chat/tailchat/docker-compose.yml +|4,39,12,104,1735019996,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 10 8 /home/chat/tailchat/docker-compose.yml +|4,39,10,8,1735019988,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 53 8 /home/chat/tailchat/docker-compose.yml +|4,39,53,8,1735019987,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 31 8 /home/chat/tailchat/docker-compose.yml +|4,39,31,8,1735019985,"/home/chat/tailchat/docker-compose.yml" +-' 69 0 /home/chat/tailchat/docker-compose.yml +|4,39,69,0,1735019981,"/home/chat/tailchat/docker-compose.yml" +-' 69 0 /home/chat/tailchat/docker-compose.yml +|4,39,69,0,1735019981,"/home/chat/tailchat/docker-compose.yml" + +# History of marks within files (newest to oldest): + +> /home/rustdesk/docker-compose.yml + * 1756955150 0 + " 50 12 + ^ 50 13 + . 50 12 + + 50 12 + +> /home/Mahjong/run.sh + * 1736486453 0 + " 10 25 + ^ 28 28 + . 8 0 + + 28 0 + + 1 0 + + 28 40 + + 26 0 + + 25 0 + + 8 0 + +> /home/chat/tailchat/docker-compose.env + * 1735023216 0 + " 22 0 + ^ 13 0 + . 13 0 + + 19 21 + + 19 13 + + 19 0 + + 27 0 + + 32 19 + + 33 18 + + 32 17 + + 30 18 + + 8 38 + + 30 19 + + 13 0 + +> /home/chat/tailchat/docker-compose.yml + * 1735019988 0 + " 12 104 + +> /home/efplctp/efplctp/efplctp/settings.py + * 1731395603 0 + " 172 12 + ^ 166 29 + . 166 28 + + 166 28 + + 207 0 + + 202 68 + + 28 11 + + 167 29 + + 166 28 + + 171 29 + + 170 28 + + 167 29 + + 166 28 + +> /data/nextcloud/config/config.php + * 1730855107 0 + " 31 18 + +> /data/nextcloud/config/config. + * 1730855092 0 + " 1 0 + +> /home/frp_0.61.0_linux_amd64/frps.toml + * 1730727403 0 + " 13 0 + . 14 0 + + 1 11 + + 13 0 + + 6 26 + + 12 29 + + 11 31 + + 12 31 + + 10 31 + + 9 31 + + 9 0 + + 6 31 + + 4 31 + + 2 31 + + 10 20 + + 2 14 + + 14 16 + + 14 29 + + 14 0 + +> /home/chat/tailchat/docker-compose. + * 1730294337 0 + " 1 0 + +> /etc/nps/conf/nps.conf + * 1730250124 0 + " 96 31 + ^ 41 25 + . 41 24 + + 16 15 + + 21 19 + + 39 19 + + 40 19 + + 41 23 + + 42 14 + + 54 32 + + 41 24 + +> /home/nps/conf/nps.conf + * 1730249947 0 + " 41 25 + ^ 41 26 + . 41 25 + + 54 18 + + 42 14 + + 41 24 + + 40 19 + + 56 25 + + 54 18 + + 41 20 + + 42 14 + + 40 19 + + 21 19 + + 16 15 + + 41 25 + +> /home/gitea/docker-compose.yml + * 1730206878 0 + " 24 0 + ^ 18 19 + . 18 18 + + 24 0 + + 5 0 + + 6 32 + + 1 1 + + 6 32 + + 18 18 + +> /etc/nginx/nginx.conf + * 1729666429 0 + " 16 36 + ^ 22 19 + . 22 18 + + 1 52 + + 1 8 + + 1 0 + + 1 55 + + 1 0 + + 1 34 + + 1 0 + + 1 34 + + 1 20 + + 33 0 + + 4 0 + + 16 29 + + 16 22 + + 30 0 + + 18 0 + + 21 14 + + 26 107 + + 23 0 + + 21 14 + + 27 30 + + 22 18 + +> /home/efplctp/biz/services/ccus/step4/cal_step4_service.py + * 1729665500 0 + " 523 37 + ^ 523 38 + . 523 37 + + 1 42 + + 1 0 + + 523 37 + +> /home/efplctp/efplctp/templates/login.html + * 1729665265 0 + " 88 14 + . 88 0 + + 87 54 + + 88 0 + +> /home/efplctp/efplctp/settings.py + * 1729665071 0 + " 172 29 + ^ 172 30 + . 172 29 + + 172 29 + + 171 28 + + 170 24 + + 171 28 + + 172 29 + +> /etc/nginx/conf.d/chat.config + * 1729659430 0 + " 5 13 + ^ 5 14 + . 5 14 + + 8 62 + + 1 0 + + 2 21 + + 3 21 + + 4 25 + + 5 21 + + 6 7 + + 7 0 + + 7 163 + + 7 0 + + 6 0 + + 7 30 + + 6 45 + + 8 0 + + 5 24 + + 6 0 + + 7 0 + + 1 21 + + 1 0 + + 8 0 + + 1 0 + + 4 0 + + 5 14 + +> ~/theme-hotline.css + * 1729122690 0 + " 1 0 + +> /data/gitea/gitea/public/css/theme-hotline.css + * 1729085274 0 + " 1 47 + ^ 1 48 + . 1 47 + + 1 47 + +> /data/gitea/gitea/public/css/theme-aquamarine.css + * 1729085175 0 + " 1 47 + ^ 1 48 + . 1 47 + + 1 47 + +> /data/gitea/gitea/conf/app.ini + * 1729082006 0 + " 53 4 + ^ 100 23 + . 100 22 + + 22 22 + + 21 22 + + 100 22 + +> /data/gitea/gitea/public/assets/css/theme-nord.css + * 1729081766 0 + " 4 2 + ^ 4 3 + . 4 0 + + 4 0 + +> /data/gitea/gitea/public/assets/css/dracula.css + * 1729081437 0 + " 1 53 + ^ 1 54 + . 1 53 + + 4 0 + + 1 53 + +> /home/Mahjong/reference/mahjong/manage.py + * 1726733726 0 + " 70 34 + ^ 70 35 + . 70 34 + + 70 34 + +> /home/Mahjong/reference/mahjong/requirements.txt + * 1726732192 0 + " 4 0 + . 4 0 + + 4 0 + +> /home/get-pip.py + * 1726731725 0 + " 10913 438 + ^ 10913 439 + . 10913 438 + + 1 7 + + 10913 438 + +> /etc/docker/daemon.json + * 1724745265 0 + " 1 0 + ^ 8 1 + . 2 0 + + 1 1 + + 1 0 + + 1 1 + + 1 0 + + 1 1 + + 8 0 + + 2 0 + +> /home/drone/docker-compose.yml + * 1724740670 0 + " 1 0 + +> /home/efplctp/efplctp/biz/views/apis/save.py + * 1723796899 0 + " 148 0 + . 33 0 + + 33 0 + +> /home/efplctp/efplctp/se + * 1723796363 0 + " 1 0 + +> settings.py + * 1723796095 0 + " 1 0 + +> /etc/apt/sources.list + * 1723106139 0 + " 1 0 + ^ 15 0 + . 3 0 + + 1 79 + + 14 93 + + 3 0 + +> /home/chat/tailchat/admin.yml + * 1722494470 0 + " 20 0 + +> /home/windows/docker-compose.yml + * 1718679037 0 + " 6 26 + ^ 6 27 + . 6 26 + + 1 201 + + 1 0 + + 1 14 + + 1 16 + + 1 15 + + 1 9 + + 15 120 + + 2 0 + + 17 36 + + 12 18 + + 13 18 + + 14 18 + + 8 16 + + 10 16 + + 17 15 + + 12 14 + + 13 14 + + 14 14 + + 6 26 + +> /data/12306/env.py + * 1717468662 0 + " 10 4 + . 10 0 + + 8 32 + + 9 21 + + 92 26 + + 94 25 + + 9 0 + + 122 22 + + 123 0 + + 126 26 + + 141 19 + + 142 0 + + 141 23 + + 155 24 + + 156 20 + + 152 0 + + 150 0 + + 147 21 + + 148 19 + + 147 0 + + 124 19 + + 127 10 + + 128 9 + + 129 18 + + 130 16 + + 129 16 + + 130 25 + + 129 23 + + 141 22 + + 126 30 + + 108 24 + + 97 16 + + 98 22 + + 100 32 + + 101 44 + + 102 40 + + 99 34 + + 98 39 + + 7 27 + + 7 29 + + 9 31 + + 10 0 + +> /data/12306/env2.py + * 1717465482 0 + " 8 32 + ^ 8 33 + . 8 32 + + 140 0 + + 139 19 + + 147 19 + + 150 0 + + 154 24 + + 123 16 + + 124 22 + + 123 19 + + 128 26 + + 8 32 + +> ~/.bashrc + * 1716426249 0 + " 105 19 + ^ 105 20 + . 105 19 + + 105 19 + +> /home/chat/docker-compose.yml + * 1716426001 0 + " 31 31 + . 1 0 + + 1 6 + + 1 0 + +> /home/chat/docker-compose.env + * 1716424088 0 + " 12 27 + ^ 12 28 + . 12 27 + + 12 15 + + 12 27 + +> /data/rocketmq/data/rocketmq/conf/broker.conf + * 1715906235 0 + " 33 24 + ^ 33 25 + . 33 24 + + 33 24 + +> /data/rocketmq/data/console/config/application.properties + * 1715906209 0 + " 19 15 + ^ 19 16 + . 19 15 + + 19 15 + +> /data/rocketmq/data/console/config/config + * 1715906203 0 + " 1 0 + ^ 1 2 + . 1 0 + + 1 0 + +> /home/rocketmq/rocketmq-docker-compose-mac-amd-arm.yml + * 1715828070 0 + " 8 16 + ^ 7 17 + . 7 16 + + 13 26 + + 3 0 + + 7 16 + +> /data/rocketmq/data/console/config/logback.xml + * 1715827464 0 + " 39 33 + +> /data/mysql/my.cnf + * 1715579438 0 + " 5 0 + ^ 5 0 + . 5 0 + + 1 8 + + 2 23 + + 5 0 + + 8 18 + + 8 19 + + 12 28 + + 9 0 + + 10 35 + + 6 0 + + 5 0 + +> /data/redis/redis.conf + * 1715415375 0 + " 786 19 + ^ 786 20 + . 786 19 + + 1832 24 + + 786 19 + +> /etc/kubernetes/manifests/etcd.yaml + * 1715063194 0 + " 25 46 + ^ 25 47 + . 25 47 + + 25 41 + + 27 39 + + 25 47 + +> ~/kubeadm.yaml + * 1715062271 0 + " 30 55 + ^ 30 56 + . 30 55 + + 12 32 + + 15 18 + + 28 55 + + 33 3 + + 30 24 + + 2 0 + + 30 24 + + 15 0 + + 17 14 + + 12 32 + + 36 27 + + 36 2 + + 30 55 + +> /etc/hosts + * 1715045219 0 + " 3 20 + ^ 3 21 + . 3 20 + + 55 21 + + 3 20 + +> /etc/containerd/config.toml + * 1715045082 0 + " 15 1 + ^ 15 2 + . 15 1 + + 15 1 + +> /etc/fstab + * 1714985473 0 + " 12 0 + ^ 11 2 + . 11 1 + + 11 35 + + 12 1 + + 11 1 + +> /etc/apt/sources.list.d/kubernetes.list + * 1714985186 0 + " 1 0 + +> ~/lyl.txt + * 1710140508 0 + " 8 147 + ^ 8 150 + . 8 147 + + 8 147 + +> /usr/games/lyl.txt + * 1709880970 0 + " 5 8 + ^ 5 9 + . 5 8 + + 4 0 + + 1 27 + + 5 8 + +> ~/.ssh/authorized_keys + * 1709877742 0 + " 1 0 + +> /home/blog/y_blog/ruoyi-ui/vue.config.js + * 1708670758 0 + " 1 0 + +> ~/1 + * 1706664587 0 + " 1 0 + +> /home/house/intelligent_household/SystemLevel/vueproject/build/webpack.dev.conf.js + * 1706231496 0 + " 91 1 + ^ 19 17 + . 19 16 + + 1 0 + + 1 9 + + 1 12 + + 1 624 + + 1 12 + + 1 624 + + 1 9 + + 92 624 + + 18 41 + + 19 16 + +> /home/house/intelligent_household/SystemLevel/vueproject/webpack.dev.conf.js + * 1706231374 0 + " 1 0 + +> /home/house/intelligent_household/SystemLevel/vueproject/config/index.js + * 1706231252 0 + " 23 27 + ^ 23 28 + . 23 27 + + 24 17 + + 23 27 + +> /home/pokemon/palworld-docker/docker-compose.yml + * 1705998088 0 + " 9 12 + ^ 9 13 + . 20 12 + + 19 11 + + 17 20 + + 20 32 + + 20 11 + + 14 31 + + 13 6 + + 14 16 + + 13 19 + + 20 22 + + 19 11 + + 20 12 + +> /data/mysql/conf.d/mysqld.cnf + * 1705890105 0 + " 2 22 + ^ 2 23 + . 2 0 + + 2 0 diff --git a/.vimrc b/.vimrc new file mode 100644 index 0000000..5516728 --- /dev/null +++ b/.vimrc @@ -0,0 +1,242 @@ +" An example for a vimrc file. +" +" To use it, copy it to +" for Unix and OS/2: ~/.vimrc +" for Amiga: s:.vimrc +" for MS-DOS and Win32: $VIM\_vimrc +" for OpenVMS: sys$login:.vimrc + +" When started as "evim", evim.vim will already have done these settings. +if v:progname =~? "evim" + finish +endif + +" Use Vim settings, rather then Vi settings (much better!). +" This must be first, because it changes other options as a side effect. +set nocompatible + +" allow backspacing over everything in insert mode +set backspace=indent,eol,start + +if has("vms") + set nobackup " do not keep a backup file, use versions instead +else + set backup " keep a backup file +endif +set history=50 " keep 50 lines of command line history +set ruler " show the cursor position all the time +set showcmd " display incomplete commands +set incsearch " do incremental searching +"========================================================================== +"My Setting-sunshanlu +"========================================================================== +vmap y :w! /tmp/vitmp +nmap p :r! cat /tmp/vitmp + +"语法高亮 +syntax enable +syntax on +"显示行号 +set nu + +"修改默认注释颜色 +"hi Comment ctermfg=DarkCyan +"允许退格键删除 +"set backspace=2 +"启用鼠标 +set mouse=a +set selection=exclusive +set selectmode=mouse,key +"按C语言格式缩进 +set cindent +set autoindent +set smartindent +set shiftwidth=4 + +" 允许在有未保存的修改时切换缓冲区 +"set hidden + +" 设置无备份文件 +set writebackup +set nobackup + +"显示括号匹配 +set showmatch +"括号匹配显示时间为1(单位是十分之一秒) +set matchtime=5 +"显示当前的行号列号: +set ruler +"在状态栏显示正在输入的命令 +set showcmd + +set foldmethod=syntax +"默认情况下不折叠 +set foldlevel=100 +" 开启状态栏信息 +set laststatus=2 +" 命令行的高度,默认为1,这里设为2 +set cmdheight=2 + + +" 显示Tab符,使用一高亮竖线代替 +set list +"set listchars=tab:\|\ , +set listchars=tab:>-,trail:- + + +"侦测文件类型 +filetype on +"载入文件类型插件 +filetype plugin on +"为特定文件类型载入相关缩进文件 +filetype indent on +" 启用自动补全 +filetype plugin indent on + + +"设置编码自动识别, 中文引号显示 +filetype on "打开文件类型检测 +"set fileencodings=euc-cn,ucs-bom,utf-8,cp936,gb2312,gb18030,gbk,big5,euc-jp,euc-kr,latin1 +set fileencodings=utf-8,gb2312,gbk,gb18030 +"这个用能很给劲,不管encoding是什么编码,都能将文本显示汉字 +"set termencoding=gb2312 +set termencoding=utf-8 +"新建文件使用的编码 +set fileencoding=utf-8 +"set fileencoding=gb2312 +"用于显示的编码,仅仅是显示 +set encoding=utf-8 +"set encoding=utf-8 +"set encoding=euc-cn +"set encoding=gbk +"set encoding=gb2312 +"set ambiwidth=double +set fileformat=unix + + +"设置高亮搜索 +set hlsearch +"在搜索时,输入的词句的逐字符高亮 +set incsearch + +" 着色模式 +set t_Co=256 +"colorscheme wombat256mod +"colorscheme gardener +"colorscheme elflord +colorscheme desert +"colorscheme evening +"colorscheme darkblue +"colorscheme torte +"colorscheme default + +" 字体 && 字号 +set guifont=Monaco:h10 +"set guifont=Consolas:h10 + +" :LoadTemplate 根据文件后缀自动加载模板 +"let g:template_path='/home/ruchee/.vim/template/' + +" :AuthorInfoDetect 自动添加作者、时间等信息,本质是NERD_commenter && authorinfo的结合 +""let g:vimrc_author='sunshanlu' +""let g:vimrc_email='sunshanlu@baidu.com' +""let g:vimrc_homepage='http://www.sunshanlu.com' +" +" +" Ctrl + E 一步加载语法模板和作者、时间信息 +""map :AuthorInfoDetectGi +""imap :AuthorInfoDetectGi +""vmap :AuthorInfoDetectGi + + + +" ======= 引号 && 括号自动匹配 ======= " +" +":inoremap ( ()i + +":inoremap ) =ClosePair(')') +" +":inoremap { {}i +" +":inoremap } =ClosePair('}') +" +":inoremap [ []i +" +":inoremap ] =ClosePair(']') +" +":inoremap < <>i +" +":inoremap > =ClosePair('>') +" +"":inoremap " ""i +" +":inoremap ' ''i +" +":inoremap ` ``i +" +":inoremap * **i + +" 每行超过80个的字符用下划线标示 +""au BufRead,BufNewFile *.s,*.asm,*.h,*.c,*.cpp,*.java,*.cs,*.lisp,*.el,*.erl,*.tex,*.sh,*.lua,*.pl,*.php,*.tpl,*.py,*.rb,*.erb,*.vim,*.js,*.jade,*.coffee,*.css,*.xml,*.html,*.shtml,*.xhtml Underlined /.\%81v/ +" +" +" For Win32 GUI: remove 't' flag from 'guioptions': no tearoff menu entries +" let &guioptions = substitute(&guioptions, "t", "", "g") + +" Don't use Ex mode, use Q for formatting +map Q gq + +" This is an alternative that also works in block mode, but the deleted +" text is lost and it only works for putting the current register. +"vnoremap p "_dp + +" Switch syntax highlighting on, when the terminal has colors +" Also switch on highlighting the last used search pattern. +if &t_Co > 2 || has("gui_running") + syntax on + set hlsearch +endif + +" Only do this part when compiled with support for autocommands. +if has("autocmd") + + " Enable file type detection. + " Use the default filetype settings, so that mail gets 'tw' set to 72, + " 'cindent' is on in C files, etc. + " Also load indent files, to automatically do language-dependent indenting. + filetype plugin indent on + + " Put these in an autocmd group, so that we can delete them easily. + augroup vimrcEx + au! + + " For all text files set 'textwidth' to 80 characters. + autocmd FileType text setlocal textwidth=80 + + " When editing a file, always jump to the last known cursor position. + " Don't do it when the position is invalid or when inside an event handler + " (happens when dropping a file on gvim). + autocmd BufReadPost * + \ if line("'\"") > 0 && line("'\"") <= line("$") | + \ exe "normal g`\"" | + \ endif + + augroup END + +else + + set autoindent " always set autoindenting on + +endif " has("autocmd") + +" 增加鼠标行高亮 +set cursorline +hi CursorLine cterm=NONE ctermbg=darkred ctermfg=white + +" 设置tab是四个空格 +set ts=4 +set expandtab + +" 主要给Tlist使用 +let Tlist_Exit_OnlyWindow = 1 +let Tlist_Auto_Open = 1 diff --git a/init.sh b/init.sh new file mode 100644 index 0000000..f0ba60f --- /dev/null +++ b/init.sh @@ -0,0 +1,1315 @@ +#!/bin/bash + +################################################################################ +# Linux 系统初始化脚本 v1.1 +# 功能: 镜像源切换 | 基础工具安装 | 系统优化配置 +# 支持: Ubuntu/Debian, CentOS/RHEL, Rocky Linux, AlmaLinux +# 作者: 自动化运维工具 +# 使用: sudo ./init_system.sh [--auto] [--mirror=aliyun] [--non-interactive] +################################################################################ + +set -euo pipefail + +# 颜色定义 - 用于终端彩色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +PURPLE='\033[0;35m' +NC='\033[0m' # No Color + +# 日志文件定义 +LOG_FILE="/var/log/system-init-$(date +%Y%m%d-%H%M%S).log" + +# 输出函数定义 +print_info() { + echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE" + echo "详细日志请查看: $LOG_FILE" >&2 +} + +# 错误处理函数 +error_exit() { + print_error "$1" + exit 1 +} + +# 检查命令是否存在 +check_command() { + if ! command -v "$1" &> /dev/null; then + print_warning "命令 $1 未找到,正在安装..." + case $OS in + ubuntu|debian) + sudo apt-get update && sudo apt-get install -y "$1" || { + print_error "安装 $1 失败" + return 1 + } + ;; + centos|rhel|rocky|almalinux) + sudo yum install -y "$1" || { + print_error "安装 $1 失败" + return 1 + } + ;; + esac + fi + return 0 +} + +# 脚本横幅显示 +print_banner() { + clear + echo -e "${PURPLE}" + echo "==================================================" + echo " Linux 系统初始化脚本 v1.1" + echo "==================================================" + echo "功能: 镜像源切换 | 基础工具安装 | 系统优化配置" + echo "支持: Ubuntu/Debian, CentOS/RHEL, Rocky, AlmaLinux" + echo "==================================================" + echo -e "${NC}" + echo "日志文件: $LOG_FILE" | tee -a "$LOG_FILE" + echo "开始时间: $(date)" | tee -a "$LOG_FILE" + echo "==================================================" | tee -a "$LOG_FILE" +} + +# 检查脚本运行权限 +check_permissions() { + if [[ $EUID -ne 0 ]] && ! sudo -n true 2>/dev/null; then + error_exit "此脚本需要 root 权限或 sudo 权限\n请使用: sudo $0" + fi + print_success "权限检查通过" +} + +# 检测操作系统类型和版本 +detect_os() { + print_info "正在检测操作系统..." + + # 检查 /etc/os-release 文件是否存在 + if [[ ! -f /etc/os-release ]]; then + error_exit "无法检测操作系统: /etc/os-release 文件不存在" + fi + + # 加载操作系统信息 + . /etc/os-release + + # 设置全局变量 + OS="$ID" + OS_NAME="$NAME" + OS_VERSION="${VERSION_ID:-unknown}" + + # 显示检测结果 + print_success "操作系统: $OS_NAME $OS_VERSION" + + # 检测网络环境 + detect_network +} + +# 检测网络环境(国内/国际) +detect_network() { + print_info "正在检测网络环境..." + + # 测试多个网站,增加检测准确性 + local test_sites=( + "www.baidu.com" + "www.google.com" + "github.com" + "mirrors.aliyun.com" + ) + + local china_count=0 + local international_count=0 + + for site in "${test_sites[@]}"; do + if timeout 3 curl -s --head "$site" > /dev/null 2>&1; then + case "$site" in + *baidu.com*|*aliyun.com*) + ((china_count++)) + ;; + *google.com*|*github.com*) + ((international_count++)) + ;; + esac + fi + done + + # 根据检测结果判断网络环境 + if [[ $china_count -gt $international_count ]]; then + NETWORK_ENV="china" + print_info "检测到国内网络环境,建议使用国内镜像源" + elif [[ $international_count -gt 0 ]]; then + NETWORK_ENV="international" + print_info "检测到国际网络环境" + else + NETWORK_ENV="unknown" + print_warning "网络环境检测失败,请检查网络连接" + fi +} + +# 备份原始软件源 +backup_sources() { + print_info "正在备份原始软件源..." + + local backup_dir="/etc/apt/backup-$(date +%Y%m%d)" + + case $OS in + ubuntu|debian) + # 创建备份目录 + sudo mkdir -p "$backup_dir" + + # 备份 sources.list + if [[ -f /etc/apt/sources.list ]]; then + sudo cp /etc/apt/sources.list "$backup_dir/sources.list.bak" + print_success "已备份到 $backup_dir/sources.list.bak" + fi + + # 备份 sources.list.d 目录 + if [[ -d /etc/apt/sources.list.d ]]; then + sudo cp -r /etc/apt/sources.list.d "$backup_dir/" + print_success "已备份 sources.list.d 目录" + fi + ;; + + centos|rhel|rocky|almalinux) + backup_dir="/etc/yum.repos.d/backup-$(date +%Y%m%d)" + sudo mkdir -p "$backup_dir" + + # 备份所有 .repo 文件 + if ls /etc/yum.repos.d/*.repo &> /dev/null; then + sudo cp /etc/yum.repos.d/*.repo "$backup_dir/" + print_success "已备份到 $backup_dir/" + else + print_warning "未找到 .repo 文件,跳过备份" + fi + ;; + + *) + print_warning "不支持的操作系统,跳过备份" + ;; + esac +} + +# 配置 Ubuntu/Debian 镜像源 +configure_ubuntu_mirrors() { + print_info "正在配置 Ubuntu/Debian 镜像源..." + + # 获取 Ubuntu 版本代号 + local ubuntu_codename + if command -v lsb_release &> /dev/null; then + ubuntu_codename=$(lsb_release -cs) + else + # 根据版本号推测代号 + case "$OS_VERSION" in + "22.04") ubuntu_codename="jammy" ;; + "20.04") ubuntu_codename="focal" ;; + "18.04") ubuntu_codename="bionic" ;; + "16.04") ubuntu_codename="xenial" ;; + *) ubuntu_codename="jammy" ;; # 默认使用最新 LTS + esac + fi + + # 如果指定了镜像源参数,直接使用 + local mirror_url="" + local mirror_name="" + + if [[ -n "${MIRROR_ARG:-}" ]]; then + case "${MIRROR_ARG}" in + aliyun) + mirror_url="http://mirrors.aliyun.com" + mirror_name="阿里云" + ;; + tsinghua) + mirror_url="https://mirrors.tuna.tsinghua.edu.cn" + mirror_name="清华大学" + ;; + ustc) + mirror_url="https://mirrors.ustc.edu.cn" + mirror_name="中国科技大学" + ;; + huawei) + mirror_url="https://repo.huaweicloud.com" + mirror_name="华为云" + ;; + nju) + mirror_url="https://mirrors.nju.edu.cn" + mirror_name="南京大学" + ;; + *) + print_warning "未知的镜像源参数,使用交互式选择" + MIRROR_ARG="" + ;; + esac + fi + + # 如果没有通过参数指定镜像源,则进行交互式选择 + if [[ -z "$mirror_url" ]]; then + echo "" + echo "请选择镜像源:" + echo "1) 阿里云 (推荐国内用户)" + echo "2) 清华大学" + echo "3) 中国科技大学" + echo "4) 华为云" + echo "5) 南京大学" + echo "6) 官方源 (推荐国际用户)" + echo "" + + read -rp "请选择 [1-6, 默认: 1]: " mirror_choice + mirror_choice=${mirror_choice:-1} + + case $mirror_choice in + 1) + mirror_url="http://mirrors.aliyun.com" + mirror_name="阿里云" + ;; + 2) + mirror_url="https://mirrors.tuna.tsinghua.edu.cn" + mirror_name="清华大学" + ;; + 3) + mirror_url="https://mirrors.ustc.edu.cn" + mirror_name="中国科技大学" + ;; + 4) + mirror_url="https://repo.huaweicloud.com" + mirror_name="华为云" + ;; + 5) + mirror_url="https://mirrors.nju.edu.cn" + mirror_name="南京大学" + ;; + 6) + print_info "使用官方源" + mirror_url="http://archive.ubuntu.com" + mirror_name="官方源" + ;; + *) + print_warning "无效选择,使用阿里云镜像" + mirror_url="http://mirrors.aliyun.com" + mirror_name="阿里云" + ;; + esac + fi + + print_info "正在配置 $mirror_name 镜像源..." + + # 生成新的 sources.list + if [[ "$mirror_url" == "http://archive.ubuntu.com" ]]; then + # 官方源配置 + sudo tee /etc/apt/sources.list > /dev/null < /dev/null < /dev/null < /dev/null < /dev/null < /dev/null && ! systemctl is-active ssh &> /dev/null; then + print_warning "SSH 服务未安装,正在安装..." + case $OS in + ubuntu|debian) + sudo apt-get install -y openssh-server + ;; + centos|rhel|rocky|almalinux) + sudo yum install -y openssh-server + ;; + esac + fi + + # 询问是否配置 SSH + if [[ -z "${NON_INTERACTIVE:-}" ]]; then + read -rp "是否优化 SSH 配置? [y/N]: " config_ssh + config_ssh=${config_ssh:-N} + + if [[ ! $config_ssh =~ ^[Yy]$ ]]; then + print_info "跳过 SSH 配置" + return + fi + fi + + # 备份 SSH 配置 + local ssh_config_backup="/etc/ssh/sshd_config.backup-$(date +%Y%m%d)" + sudo cp /etc/ssh/sshd_config "$ssh_config_backup" + print_success "SSH 配置已备份到 $ssh_config_backup" + + # SSH 优化配置参数 + local ssh_config_changes=( + "# 优化 SSH 配置 - 修改于 $(date)" + "UseDNS no" + "GSSAPIAuthentication no" + "ClientAliveInterval 60" + "ClientAliveCountMax 3" + "MaxAuthTries 3" + "LoginGraceTime 60" + "PermitRootLogin prohibit-password" + "PasswordAuthentication yes" + "PubkeyAuthentication yes" + "AllowTcpForwarding yes" + "X11Forwarding no" + "PrintMotd no" + "PrintLastLog yes" + ) + + # 应用 SSH 配置 + print_info "应用 SSH 优化配置..." + + # 删除旧配置并添加新配置 + for config_line in "${ssh_config_changes[@]}"; do + if [[ $config_line =~ ^[^#] ]]; then + local config_key=$(echo "$config_line" | awk '{print $1}') + sudo sed -i "/^$config_key/d" /etc/ssh/sshd_config + fi + done + + # 添加新配置 + for config_line in "${ssh_config_changes[@]}"; do + echo "$config_line" | sudo tee -a /etc/ssh/sshd_config > /dev/null + done + + # 重启 SSH 服务 + print_info "重启 SSH 服务..." + if command -v systemctl &> /dev/null; then + sudo systemctl daemon-reload + sudo systemctl restart sshd 2>/dev/null || sudo systemctl restart ssh 2>/dev/null + sudo systemctl enable sshd 2>/dev/null || sudo systemctl enable ssh 2>/dev/null + else + sudo service sshd restart 2>/dev/null || sudo service ssh restart 2>/dev/null + fi + + print_success "SSH 配置优化完成" +} + +# 配置时区 +configure_timezone() { + print_info "正在配置时区..." + + local current_tz="" + + # 获取当前时区 + if command -v timedatectl &> /dev/null; then + current_tz=$(timedatectl | grep "Time zone" | awk '{print $3}') + fi + + print_info "当前时区: ${current_tz:-未知}" + + # 询问是否设置时区 + if [[ -z "${NON_INTERACTIVE:-}" ]]; then + read -rp "是否设置为中国时区 (Asia/Shanghai)? [Y/n]: " set_tz + set_tz=${set_tz:-Y} + else + set_tz="Y" + fi + + if [[ $set_tz =~ ^[Yy]$ ]]; then + # 尝试使用 timedatectl + if command -v timedatectl &> /dev/null; then + sudo timedatectl set-timezone Asia/Shanghai + else + # 备选方案:直接链接时区文件 + sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + if [[ -f /etc/redhat-release ]]; then + echo "ZONE=\"Asia/Shanghai\"" | sudo tee /etc/sysconfig/clock > /dev/null + fi + fi + + # 同步硬件时钟 + sudo hwclock --systohc 2>/dev/null || true + + print_success "时区已设置为 Asia/Shanghai" + fi +} + +# 配置语言环境 +configure_locale() { + print_info "正在配置语言环境..." + + # 询问是否配置中文语言环境 + if [[ -z "${NON_INTERACTIVE:-}" ]]; then + read -rp "是否配置中文语言环境? [y/N]: " set_locale + set_locale=${set_locale:-N} + + if [[ ! $set_locale =~ ^[Yy]$ ]]; then + print_info "跳过语言环境配置" + return + fi + fi + + case $OS in + ubuntu|debian) + # 安装中文语言包 + sudo apt-get install -y language-pack-zh-hans + + # 生成语言环境 + sudo locale-gen zh_CN.UTF-8 + sudo locale-gen zh_CN.GBK + sudo locale-gen zh_CN.GB2312 + + # 设置系统语言环境 + sudo update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 + ;; + + centos|rhel|rocky|almalinux) + # 安装中文语言包 + sudo yum install -y glibc-langpack-zh + + # 设置语言环境 + local lang_conf="/etc/locale.conf" + if [[ -f "$lang_conf" ]]; then + sudo sed -i 's/^LANG=.*/LANG="zh_CN.UTF-8"/' "$lang_conf" + else + echo 'LANG="zh_CN.UTF-8"' | sudo tee "$lang_conf" > /dev/null + fi + ;; + esac + + # 设置临时环境变量 + export LANG=zh_CN.UTF-8 + export LC_ALL=zh_CN.UTF-8 + + print_success "中文语言环境配置完成" +} + +# 系统优化配置 +optimize_system() { + print_info "正在应用系统优化配置..." + + # 询问是否进行系统优化 + if [[ -z "${NON_INTERACTIVE:-}" ]]; then + read -rp "是否应用系统优化配置? [Y/n]: " do_optimize + do_optimize=${do_optimize:-Y} + + if [[ ! $do_optimize =~ ^[Yy]$ ]]; then + print_info "跳过系统优化" + return + fi + fi + + # 1. 优化文件描述符限制 + optimize_file_descriptors + + # 2. 优化内核参数 + optimize_kernel_params + + # 3. 优化系统服务 + optimize_services + + # 4. 优化交换分区 + optimize_swap + + print_success "系统优化配置完成" +} + +# 优化文件描述符限制 +optimize_file_descriptors() { + print_info "优化文件描述符限制..." + + local limits_conf="/etc/security/limits.conf" + + # 备份原配置 + sudo cp "$limits_conf" "${limits_conf}.backup-$(date +%Y%m%d)" + + # 设置文件描述符限制 + if ! grep -q "^\* soft nofile" "$limits_conf"; then + echo "* soft nofile 65535" | sudo tee -a "$limits_conf" > /dev/null + echo "* hard nofile 65535" | sudo tee -a "$limits_conf" > /dev/null + echo "root soft nofile 65535" | sudo tee -a "$limits_conf" > /dev/null + echo "root hard nofile 65535" | sudo tee -a "$limits_conf" > /dev/null + print_success "文件描述符限制已优化" + else + print_info "文件描述符限制已经配置" + fi + + # 对于 systemd 系统 + if [[ -d /etc/systemd/system ]]; then + local systemd_conf="/etc/systemd/system.conf" + sudo sed -i 's/^#DefaultLimitNOFILE=.*/DefaultLimitNOFILE=65535/' "$systemd_conf" + sudo sed -i 's/^#DefaultLimitNPROC=.*/DefaultLimitNPROC=65535/' "$systemd_conf" + fi +} + +# 优化内核参数 +optimize_kernel_params() { + print_info "优化内核参数..." + + local sysctl_conf="/etc/sysctl.d/99-custom.conf" + + # 创建优化配置文件 + sudo tee "$sysctl_conf" > /dev/null <<'EOF' +# ======================== +# 系统内核优化配置 +# 生成时间: $(date) +# ======================== + +# 网络优化 +# 最大连接数 +net.core.somaxconn = 65535 +net.core.netdev_max_backlog = 65535 + +# 缓冲区大小 +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 +net.ipv4.tcp_rmem = 4096 87380 16777216 +net.ipv4.tcp_wmem = 4096 65536 16777216 + +# TCP 优化 +net.ipv4.tcp_max_syn_backlog = 65535 +net.ipv4.tcp_syncookies = 1 +net.ipv4.tcp_syn_retries = 2 +net.ipv4.tcp_synack_retries = 2 +net.ipv4.tcp_max_tw_buckets = 2000000 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.tcp_tw_recycle = 0 +net.ipv4.tcp_fin_timeout = 30 +net.ipv4.tcp_keepalive_time = 1200 +net.ipv4.tcp_keepalive_probes = 3 +net.ipv4.tcp_keepalive_intvl = 30 + +# 连接跟踪 +net.netfilter.nf_conntrack_max = 655350 +net.netfilter.nf_conntrack_tcp_timeout_established = 1200 + +# 文件系统优化 +fs.file-max = 6553500 +fs.inotify.max_user_watches = 524288 +fs.inotify.max_user_instances = 256 + +# 内存优化 +vm.swappiness = 10 +vm.vfs_cache_pressure = 50 +vm.dirty_ratio = 10 +vm.dirty_background_ratio = 5 +vm.overcommit_memory = 1 + +# IPv6 配置 (如果不需要可以禁用) +net.ipv6.conf.all.disable_ipv6 = 1 +net.ipv6.conf.default.disable_ipv6 = 1 + +# 安全设置 +net.ipv4.conf.all.rp_filter = 1 +net.ipv4.conf.default.rp_filter = 1 +net.ipv4.icmp_echo_ignore_broadcasts = 1 +net.ipv4.icmp_ignore_bogus_error_responses = 1 +EOF + + # 重新加载 sysctl 配置 + sudo sysctl -p "$sysctl_conf" > /dev/null 2>&1 || { + print_warning "部分内核参数优化失败,可能需要在重启后生效" + } + + print_success "内核参数优化完成" +} + +# 优化系统服务 +optimize_services() { + print_info "优化系统服务..." + + # 禁用不必要的服务(根据实际情况调整) + local services_to_disable=( + "postfix" # 邮件服务,如果不是邮件服务器 + "avahi-daemon" # mDNS 服务 + ) + + for service in "${services_to_disable[@]}"; do + if systemctl is-enabled "$service" &> /dev/null; then + sudo systemctl disable "$service" 2>/dev/null || true + sudo systemctl stop "$service" 2>/dev/null || true + print_info "已禁用服务: $service" + fi + done +} + +# 优化交换分区 +optimize_swap() { + print_info "优化交换分区..." + + # 检查交换分区是否存在 + if [[ $(swapon --show | wc -l) -eq 0 ]]; then + print_warning "未找到交换分区,如需创建请运行: sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile" + return + fi + + # 调整 swappiness 值(如果已经在内核参数中设置过,这里不会重复设置) + local current_swappiness=$(cat /proc/sys/vm/swappiness 2>/dev/null || echo "60") + print_info "当前 swappiness 值: $current_swappiness" +} + +# 清理系统 +clean_system() { + print_info "正在清理系统..." + + # 询问是否清理系统 + if [[ -z "${NON_INTERACTIVE:-}" ]]; then + read -rp "是否清理系统缓存和无用包? [Y/n]: " do_clean + do_clean=${do_clean:-Y} + + if [[ ! $do_clean =~ ^[Yy]$ ]]; then + print_info "跳过系统清理" + return + fi + fi + + case $OS in + ubuntu|debian) + print_info "清理 APT 缓存..." + sudo apt-get autoremove -y + sudo apt-get autoclean -y + sudo apt-get clean + + # 清理旧内核 + sudo apt-get purge -y $(dpkg -l | awk '/^ii linux-image-*/ && $2 !~ /'$(uname -r)'/ {print $2}') 2>/dev/null || true + + # 清理日志文件(保留最近7天) + sudo find /var/log -type f -name "*.log" -mtime +7 -delete 2>/dev/null || true + ;; + + centos|rhel|rocky|almalinux) + print_info "清理 YUM 缓存..." + sudo yum autoremove -y + sudo yum clean all + + # 清理旧内核(保留最近2个) + sudo package-cleanup --oldkernels --count=2 -y 2>/dev/null || true + + # 清理日志文件 + sudo journalctl --vacuum-time=7d 2>/dev/null || true + ;; + esac + + # 清理临时文件 + print_info "清理临时文件..." + sudo rm -rf /tmp/* 2>/dev/null || true + sudo rm -rf /var/tmp/* 2>/dev/null || true + + print_success "系统清理完成" +} + +# 显示系统信息 +show_system_info() { + echo "" + print_success "==================== 系统信息 ====================" + echo "" + + # 操作系统信息 + if [[ -f /etc/os-release ]]; then + echo "操作系统: $(grep PRETTY_NAME /etc/os-release | cut -d'"' -f2)" + fi + + # 内核信息 + echo "内核版本: $(uname -r)" + echo "系统架构: $(uname -m)" + + # CPU 信息 + if command -v nproc &> /dev/null; then + echo "CPU 核心: $(nproc)" + fi + + # 内存信息 + if command -v free &> /dev/null; then + echo "内存大小: $(free -h | awk '/^Mem:/ {print $2}')" + echo "可用内存: $(free -h | awk '/^Mem:/ {print $7}')" + fi + + # 磁盘信息 + if command -v df &> /dev/null; then + echo "根目录空间: $(df -h / | awk 'NR==2 {print $2 " 已用: " $3 " (" $5 ")"}')" + fi + + # 系统负载 + if [[ -f /proc/loadavg ]]; then + load=$(cat /proc/loadavg) + echo "系统负载: ${load:0:16}" + fi + + # 运行时间 + if command -v uptime &> /dev/null; then + echo "运行时间: $(uptime -p | sed 's/up //')" + fi + + # 用户信息 + echo "当前用户: $(whoami)" + echo "主机名称: $(hostname)" + + # IP 地址信息 + if command -v ip &> /dev/null; then + echo "IP 地址: $(ip route get 1 | awk '{print $7; exit}')" + elif command -v hostname &> /dev/null; then + echo "主机名: $(hostname -I 2>/dev/null | awk '{print $1}')" + fi + + # 时区信息 + if command -v timedatectl &> /dev/null; then + echo "时区设置: $(timedatectl | grep "Time zone" | awk '{print $3}')" + echo "NTP 同步: $(timedatectl | grep "NTP synchronized" | awk '{print $3}')" + fi + + echo "" + print_success "==================================================" + echo "" +} + +# 显示主菜单 +show_menu() { + echo "" + echo "请选择要执行的操作:" + echo "" + echo "1) 完整初始化 (推荐)" + echo " - 更换镜像源" + echo " - 安装基础工具" + echo " - 系统优化" + echo " - SSH 配置" + echo " - 时区设置" + echo " - 系统清理" + echo "" + echo "2) 仅更换镜像源" + echo "3) 仅安装基础工具" + echo "4) 仅系统优化" + echo "5) 仅配置 SSH" + echo "6) 显示系统信息" + echo "7) 查看日志文件" + echo "8) 退出脚本" + echo "" +} + +# 完整初始化流程 +full_initialization() { + print_info "开始完整系统初始化..." + + # 1. 备份原始配置 + backup_sources + + # 2. 配置镜像源 + case $OS in + ubuntu|debian) + configure_ubuntu_mirrors || { + print_warning "镜像源配置失败,继续其他步骤..." + } + ;; + centos|rhel|rocky|almalinux) + configure_centos_mirrors || { + print_warning "镜像源配置失败,继续其他步骤..." + } + ;; + *) + print_warning "暂不支持该系统的镜像源配置" + ;; + esac + + # 3. 安装基础工具 + install_basic_tools + + # 4. 配置时区 + configure_timezone + + # 5. 配置语言环境(可选) + if [[ -z "${NON_INTERACTIVE:-}" ]]; then + configure_locale + fi + + # 6. 配置 SSH + configure_ssh + + # 7. 系统优化 + optimize_system + + # 8. 系统清理 + clean_system + + print_success "系统初始化完成!" + + # 显示系统信息 + show_system_info + + # 显示后续建议 + echo "" + print_info "建议执行以下操作:" + echo "1. 重启系统使所有配置生效: sudo reboot" + echo "2. 检查系统更新: sudo apt-get upgrade 或 sudo yum update" + echo "3. 查看详细日志: cat $LOG_FILE" + echo "" +} + +# 查看日志文件 +view_log_file() { + echo "" + print_info "日志文件内容 (最后50行):" + echo "==================================================" + tail -50 "$LOG_FILE" + echo "==================================================" + echo "" + print_info "完整日志文件路径: $LOG_FILE" +} + +# 显示帮助信息 +show_help() { + echo "" + echo "Linux 系统初始化脚本 v1.1" + echo "" + echo "用法: $0 [选项]" + echo "" + echo "选项:" + echo " --auto 自动模式 (非交互式,使用默认配置)" + echo " --mirror=SOURCE 指定镜像源 (aliyun, tsinghua, ustc, huawei)" + echo " --non-interactive 非交互模式 (跳过所有确认)" + echo " --help 显示此帮助信息" + echo "" + echo "示例:" + echo " sudo $0 --auto" + echo " sudo $0 --mirror=aliyun --non-interactive" + echo "" +} + +# 解析命令行参数 +parse_arguments() { + while [[ $# -gt 0 ]]; do + case $1 in + --auto) + AUTO_MODE=1 + NON_INTERACTIVE=1 + MIRROR_ARG="aliyun" + shift + ;; + --mirror=*) + MIRROR_ARG="${1#*=}" + shift + ;; + --non-interactive) + NON_INTERACTIVE=1 + shift + ;; + --help|-h) + show_help + exit 0 + ;; + *) + print_error "未知参数: $1" + show_help + exit 1 + ;; + esac + done +} + +# 主函数 +main() { + # 解析命令行参数 + parse_arguments "$@" + + # 显示横幅 + print_banner + + # 检查权限 + check_permissions + + # 检测操作系统 + detect_os + + # 检查必要命令 + check_command "curl" || error_exit "curl 安装失败" + check_command "wget" || print_warning "wget 安装失败,部分功能可能受限" + + # 自动模式直接执行完整初始化 + if [[ -n "${AUTO_MODE:-}" ]]; then + full_initialization + exit 0 + fi + + # 交互式菜单 + while true; do + show_menu + read -rp "请选择操作 [1-8]: " choice + + case $choice in + 1) + full_initialization + break + ;; + 2) + backup_sources + case $OS in + ubuntu|debian) + configure_ubuntu_mirrors + ;; + centos|rhel|rocky|almalinux) + configure_centos_mirrors + ;; + esac + ;; + 3) + install_basic_tools + ;; + 4) + optimize_system + ;; + 5) + configure_ssh + ;; + 6) + show_system_info + ;; + 7) + view_log_file + ;; + 8) + print_info "退出脚本" + echo "详细日志请查看: $LOG_FILE" + exit 0 + ;; + *) + print_warning "无效选择,请重新输入" + ;; + esac + + # 询问是否继续 + if [[ $choice -ne 8 ]]; then + echo "" + read -rp "是否继续其他操作? [Y/n]: " continue_choice + continue_choice=${continue_choice:-Y} + if [[ ! $continue_choice =~ ^[Yy]$ ]]; then + print_info "退出脚本" + echo "详细日志请查看: $LOG_FILE" + exit 0 + fi + fi + done +} + +# 脚本入口点 +main "$@" \ No newline at end of file