auto_run.sh 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/bin/bash
  2. # 获取环境变量
  3. USER=${USER}
  4. HOST=${HOST}
  5. SUDO_PASS=${SUDO_PASS}
  6. USER_HOME=/home/$USER
  7. # 检查环境变量是否为空
  8. if [ -z "$HOST" ]; then
  9. echo "Error: 远程主机地址不能为空"
  10. exit 1
  11. fi
  12. if [ -z "$USER" ]; then
  13. echo "Error: 用户名不能为空"
  14. exit 1
  15. fi
  16. if [ -z "$SUDO_PASS" ]; then
  17. echo "Error: sudo 密码不能为空"
  18. exit 1
  19. fi
  20. # 将 start_socat.sh 拷贝到 host 的用户 home 目录上
  21. rsync -avz start_socat.sh $USER@$HOST:$USER_HOME/
  22. # 创建一个临时远程脚本文件
  23. REMOTE_SCRIPT=$(mktemp)
  24. cat << 'EOF' > $REMOTE_SCRIPT
  25. #!/bin/bash
  26. # 获取 sudo 密码
  27. SUDO_PASS=$1
  28. USER_HOME=$2
  29. # 安装必要的软件包
  30. REQUIRED_PACKAGES="socat openvpn rsync nmap"
  31. for package in $REQUIRED_PACKAGES; do
  32. if ! dpkg -l | grep -qw $package; then
  33. echo "$SUDO_PASS" | sudo -S apt-get update && sudo -S apt-get install -y $package
  34. fi
  35. done
  36. # 查找包含 "meter" 的目录,忽略权限错误
  37. METER_DIRS=$(find $USER_HOME -type d -name "*meter*" 2>/dev/null)
  38. if [ $(echo "$METER_DIRS" | wc -l) -eq 0 ]; then
  39. echo "Error: No directory containing meter found in home directory."
  40. exit 1
  41. elif [ $(echo "$METER_DIRS" | wc -l) -gt 1 ]; then
  42. for METER_DIR in $METER_DIRS; do
  43. METER_FILE=$(find "$METER_DIR" -name "meter*" -type f 2>/dev/null)
  44. if [ -z "$METER_FILE" ]; then
  45. echo "Error: No meter binary found in $METER_DIR."
  46. exit 1
  47. fi
  48. if [ ! -f "$METER_DIR/start_meter.sh" ]; then
  49. echo "Error: $METER_DIR/start_meter.sh not found."
  50. exit 1
  51. fi
  52. echo "$SUDO_PASS" | sudo -S sh -c "(sudo crontab -l 2>/dev/null; echo \"@reboot cd $METER_DIR && ./start_meter.sh\") | sudo crontab -"
  53. done
  54. else
  55. METER_DIR=$(echo "$METER_DIRS" | head -n 1)
  56. echo "Meter directory found: $METER_DIR"
  57. METER_FILE=$(find "$METER_DIR" -name "meter*" -type f 2>/dev/null)
  58. if [ -z "$METER_FILE" ]; then
  59. echo "Error: No meter binary found in $METER_DIR."
  60. exit 1
  61. fi
  62. if [ ! -f "$METER_DIR/start_meter.sh" ]; then
  63. echo "Error: $METER_DIR/start_meter.sh not found."
  64. exit 1
  65. fi
  66. rsync -avz $USER_HOME/start_socat.sh $METER_DIR/
  67. echo "$SUDO_PASS" | sudo -S chmod +x $METER_DIR/start_meter.sh $METER_DIR/start_socat.sh
  68. echo "$SUDO_PASS" | sudo -S sh -c "(sudo crontab -l 2>/dev/null; echo \"@reboot cd $METER_DIR && ./start_meter.sh\") | sudo crontab -"
  69. fi
  70. # 修改 root 的 crontab,开机自动运行 start_socat.sh
  71. echo "$SUDO_PASS" | sudo -S sh -c "(sudo crontab -l 2>/dev/null | grep -v 'start_socat.sh'; echo \"@reboot cd $USER_HOME && ./start_socat.sh\") | sudo crontab -"
  72. EOF
  73. # 将远程脚本文件传输到远程主机
  74. rsync -avz $REMOTE_SCRIPT $USER@$HOST:$USER_HOME/remote_script.sh
  75. # 执行远程脚本文件
  76. ssh $USER@$HOST "chmod +x $USER_HOME/remote_script.sh && $USER_HOME/remote_script.sh $SUDO_PASS $USER_HOME"
  77. # 删除临时脚本文件
  78. rm $REMOTE_SCRIPT
  79. ssh $USER@$HOST "rm $USER_HOME/remote_script.sh"