跳至主要內容

ssh

chanchaw大约 7 分钟ubuntu

概述

新安装的 ubuntu 默认没有 ssh ,需要自己手动安装

安装

# 先更新,新安装系统需要先更新安装源
sudo apt update
# 再安装
sudo apt install openssh-server -y
# 查看启动,设置自启动
systemctl status sshd
systemctl start sshd
systemctl enable sshd
# 默认端口号22

脚本工具

查询所有java进程

罗列所有java进程

将下面代码保存为 java_process_check.sh ,执行 chmod +x java_process_check.sh 赋予科执行权限,运行后罗列所有 java 进程并显示使用的端口号,可执行命令 sudo ln -s /root/bin/java_process_check.sh /usr/local/bin/jpc 制作软连接,可全局使用,在终端输入命令 jpc

#!/bin/bash

# 检查Java进程和端口脚本
echo "正在扫描Java进程和端口信息..."
echo "=============================================="

# 检查是否以root运行,如果不是则提示
if [[ $EUID -ne 0 ]]; then
   echo "注意: 非root用户运行可能无法查看所有进程的完整信息" 
   echo "=============================================="
fi

# 查找所有Java进程
java_pids=$(ps -ef | grep java | grep -v grep | awk '{print $2}')

if [[ -z "$java_pids" ]]; then
    echo "未找到任何Java进程"
    exit 0
fi

# 计数器
count=0

# 遍历每个Java进程
for pid in $java_pids; do
    ((count++))
    echo "Java进程 #$count:"
    echo "----------------------------------------------"
    
    # 获取进程基本信息
    process_info=$(ps -p $pid -o pid,user,pcpu,pmem,cmd --no-headers 2>/dev/null)
    
    if [[ -z "$process_info" ]]; then
        echo "进程 $pid 不存在或无法访问"
        echo ""
        continue
    fi
    
    # 显示进程基本信息
    echo "PID:    $(echo $process_info | awk '{print $1}')"
    echo "用户:   $(echo $process_info | awk '{print $2}')"
    echo "CPU:    $(echo $process_info | awk '{print $3}')%"
    echo "内存:   $(echo $process_info | awk '{print $4}')%"
    
    # 获取完整的命令行
    cmd_line=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ')
    
    if [[ -n "$cmd_line" ]]; then
        # 提取jar文件路径
        jar_path=$(echo "$cmd_line" | grep -o -E '[^ ]+\.jar' | head -1)
        
        if [[ -n "$jar_path" ]]; then
            # 如果找到的是相对路径,尝试转换为绝对路径
            if [[ "$jar_path" != /* ]]; then
                # 获取进程的工作目录
                cwd=$(readlink /proc/$pid/cwd 2>/dev/null)
                if [[ -n "$cwd" ]]; then
                    absolute_jar_path="${cwd}/${jar_path}"
                    if [[ -f "$absolute_jar_path" ]]; then
                        jar_path="$absolute_jar_path"
                    fi
                fi
            fi
            echo "JAR路径: $jar_path"
        else
            echo "JAR路径: 未找到或不是jar启动"
            # 显示主类信息
            main_class=$(echo "$cmd_line" | grep -o -E '([a-zA-Z0-9_]+\.)+[a-zA-Z0-9_]+' | head -1)
            if [[ -n "$main_class" ]]; then
                echo "主类:   $main_class"
            fi
        fi
        
        # 显示完整的命令行(截断过长的行)
        echo "命令行: $(echo "$cmd_line" | cut -c1-100)$(if [ ${#cmd_line} -gt 100 ]; then echo "..."; fi)"
    else
        echo "JAR路径: 无法获取进程信息"
    fi
    
    # 获取进程使用的端口
    echo "端口:"
    ports=$(ss -tlnp 2>/dev/null | awk -v pid=$pid '$7 ~ pid {print $4}' | awk -F: '{print $NF}' | sort -nu)
    
    if [[ -n "$ports" ]]; then
        echo "$ports" | while read port; do
            echo "  - $port"
        done
    else
        # 尝试使用netstat作为备选
        ports=$(netstat -tlnp 2>/dev/null | awk -v pid=$pid '$7 ~ pid {split($4, a, ":"); print a[length(a)]}' | sort -nu)
        if [[ -n "$ports" ]]; then
            echo "$ports" | while read port; do
                echo "  - $port"
            done
        else
            echo "  - 未找到监听的TCP端口"
        fi
    fi
    
    # 获取进程启动时间
    start_time=$(ps -p $pid -o lstart --no-headers 2>/dev/null)
    if [[ -n "$start_time" ]]; then
        echo "启动时间: $start_time"
    fi
    
    echo ""
done

echo "=============================================="
echo "总共找到 $count 个Java进程"

# 显示端口汇总信息
echo ""
echo "端口汇总:"
echo "----------------------------------------------"
all_ports=$(ss -tlnp 2>/dev/null | grep java | awk '{print $4}' | awk -F: '{print $NF}' | sort -nu)

if [[ -n "$all_ports" ]]; then
    echo "$all_ports" | while read port; do
        # 获取使用该端口的进程信息
        using_pids=$(ss -tlnp 2>/dev/null | awk -v port=":$port" '$4 ~ port {print $7}' | cut -d= -f2 | cut -d, -f1 | sort -u)
        echo "端口 $port 被进程: $using_pids 使用"
    done
else
    echo "未找到Java进程监听的端口"
fi

echo "=============================================="

部署java8环境

简介

xdf250 服务器上拷贝文件 \\192.168.0.250\alist\安装程序\cc\devtools\java\java8\java8linux.zipubuntu22server 的路径 /usr/local 下,然后执行下面命令的文件 deploy_java8.sh,批处理执行完毕后仍然需要执行 source /etc/profile 更新环境变量

文件 /usr/local/deploy_java8.sh 的代码
#!/bin/bash

# 提示用户确认文件是否已上传
echo "请确认是否已经将文件 java8linux.zip 上传到 /usr/local/ 目录下。"
read -p "如果已经上传,请输入 'y' 继续;否则请输入 'n' 退出脚本: " confirm

if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
    echo "请先将文件 java8linux.zip 上传到 /usr/local/ 目录下,再重新运行脚本。"
    exit 1
fi

# 检查文件是否存在
if [ ! -f "/usr/local/java8linux.zip" ]; then
    echo "错误: /usr/local/java8linux.zip 文件不存在,请确认文件已上传。"
    exit 1
fi

# 检查当前用户是否有sudo权限
if [ "$(id -u)" -ne 0 ]; then
    echo "请使用 sudo 运行此脚本,以便获取必要的权限。"
    exit 1
fi

# 解压文件(移除-O选项,因为Linux unzip可能不支持)
echo "正在解压文件..."
cd /usr/local/
if ! unzip java8linux.zip; then
    echo "解压失败,请检查zip文件是否完整。"
    exit 1
fi

# 检查解压后的目录是否存在,并重命名
if [ -d "/usr/local/java" ]; then
    mv java java8
else
    echo "解压后未找到 'java' 目录,请检查zip文件内容。"
    exit 1
fi

# 备份原有的/etc/profile文件
cp /etc/profile /etc/profile.bak.$(date +%Y%m%d%H%M%S)
echo "已备份/etc/profile至/etc/profile.bak.$(date +%Y%m%d%H%M%S)"

# 向/etc/profile追加环境变量配置
echo "正在配置环境变量..."
cat << EOF >> /etc/profile
# Java Environment Variables
export JAVA_HOME=/usr/local/java8
export JRE_HOME=/usr/local/java8/jre
export PATH=\$PATH:\$JAVA_HOME/bin:\$JRE_HOME/bin
export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar:\$JRE_HOME/lib
EOF

# 更新环境变量
source /etc/profile

# 验证Java环境是否可用
echo "验证Java安装..."
if which java >/dev/null 2>&1; then
    java -version
else
    echo "Java环境配置失败,请检查日志。"
    exit 1
fi

if which javac >/dev/null 2>&1; then
    javac -version
else
    echo "Javac环境配置失败,请检查日志。"
    exit 1
fi

echo "Java 8环境部署完成!"
echo "请执行命令 'source /etc/profile' 使环境变量生效。然后通过命令 java -version 检测是否可用"

更改默认端口

简介

将下面代码制作为 ~/bin/change_ssh_port.sh 文件后执行,会提示想要修改的目标端口号。有重启 sshd 的代码,但是没有效果,最终还是要重启电脑

详情
#!/bin/bash

# 检查是否为root用户
if [ "$(id -u)" -ne 0 ]; then
    echo "请使用root用户或通过sudo运行此脚本"
    exit 1
fi

# 显示当前SSH端口
current_port=$(grep -oP '^Port \K\d+' /etc/ssh/sshd_config 2>/dev/null || echo "22")
echo "当前SSH端口: $current_port"

# 询问用户要修改的端口号
while true; do
    read -p "请输入要修改的新SSH端口号(1-65535): " new_port
    
    # 检查端口号是否合法
    if [[ ! "$new_port" =~ ^[0-9]+$ ]] || [ "$new_port" -lt 1 ] || [ "$new_port" -gt 65535 ]; then
        echo "错误:端口号必须是1-65535之间的数字"
        continue
    fi
    
    # 检查端口是否与当前相同
    if [ "$new_port" -eq "$current_port" ]; then
        echo "新端口与当前端口相同,无需修改"
        exit 0
    fi
    
    # 检查端口是否已被使用
    if ss -tuln | grep -q ":$new_port "; then
        echo "错误:端口 $new_port 已被其他服务使用"
        continue
    fi
    
    break
done

# 备份原始配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
echo "已备份原始配置文件到 /etc/ssh/sshd_config.bak"

# 修改SSH端口
if grep -q "^Port " /etc/ssh/sshd_config; then
    sed -i "s/^Port .*/Port $new_port/" /etc/ssh/sshd_config
else
    echo "Port $new_port" >> /etc/ssh/sshd_config
fi

# 重启SSH服务
systemctl restart sshd

# 检查防火墙设置
if command -v ufw &> /dev/null && ufw status | grep -q "Status: active"; then
    ufw allow "$new_port"/tcp
    echo "已更新UFW防火墙规则,允许端口 $new_port"
fi

echo "SSH端口已成功修改为 $new_port"
echo "请确保您已测试新端口连接后再关闭当前会话!"

保存后设置权限 sudo chmod +x ~/bin/change_ssh_port.sh

重启电脑前记得先放行新的端口号

#!/bin/bash

# 检查root权限
if [ "$(id -u)" -ne 0 ]; then
    echo "请使用sudo或root用户运行此脚本"
    exit 1
fi

# 默认端口
DEFAULT_PORT=19834

# 询问用户端口号
read -p "请输入要开放的端口号(默认:${DEFAULT_PORT}): " PORT
PORT=${PORT:-$DEFAULT_PORT}

# 验证端口号是否合法
if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1 ] || [ "$PORT" -gt 65535 ]; then
    echo "错误:端口号必须是1-65535之间的数字"
    exit 1
fi

# 检查端口是否已被占用
if ss -tuln | grep -q ":${PORT} "; then
    echo "警告:端口 ${PORT} 已被其他服务监听,请确认是否继续开放(y/N): "
    read -r CONFIRM
    if [[ ! "$CONFIRM" =~ ^[Yy] ]]; then
        echo "操作已取消"
        exit 0
    fi
fi

# 开放端口(优先使用ufw,否则用iptables)
if command -v ufw &> /dev/null; then
    echo "检测到UFW防火墙,正在开放端口 ${PORT}..."
    ufw allow "$PORT/tcp"
    ufw reload
    echo "UFW已开放端口 ${PORT}"
else
    echo "未检测到UFW,正在使用iptables开放端口 ${PORT}..."
    iptables -A INPUT -p tcp --dport "$PORT" -j ACCEPT
    iptables-save > /etc/iptables/rules.v4
    echo "iptables已开放端口 ${PORT}"
fi

# 输出提示
echo -e "\n成功开放端口: ${PORT}"
echo "如需永久生效,请确保保存了防火墙规则(UFW会自动保存,iptables需手动持久化)"