diff --git a/.github/workflows/task4-remote-access-report.yml b/.github/workflows/task4-remote-access-report.yml new file mode 100644 index 0000000..93253ea --- /dev/null +++ b/.github/workflows/task4-remote-access-report.yml @@ -0,0 +1,33 @@ +name: Task 4 - SSH and RDP remote access report + +on: + workflow_dispatch: + push: + paths: + - '.github/workflows/task4-remote-access-report.yml' + - 'scripts/task4_remote_access_report.sh' + - 'scripts/build_pdf_report.py' + - 'scripts/text_to_png.py' + +jobs: + build-report-task4: + runs-on: ubuntu-latest + env: + REPORT_AUTHOR: Миленькова Ивана + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y python3-pil + + - name: Generate PDF report + run: bash scripts/task4_remote_access_report.sh + + - name: Upload PDF artifact + uses: actions/upload-artifact@v4 + with: + name: task4-report-pdf + path: reports/task4/report.pdf diff --git a/README.md b/README.md index e13be11..2eb6806 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # Автоматические отчёты по заданиям (GitHub Actions) -В репозитории настроены **3 отдельных workflow** (по одному на каждую практическую работу): +В репозитории настроены **4 отдельных workflow** (по одному на каждую практическую работу): 1. `Task 1 - VM and Linux install report` 2. `Task 2 - Terminal commands report` 3. `Task 3 - Filesystem image report` +4. `Task 4 - SSH and RDP remote access report` Каждый workflow: - запускается вручную (`workflow_dispatch`), diff --git a/scripts/task4_remote_access_report.sh b/scripts/task4_remote_access_report.sh new file mode 100755 index 0000000..d324462 --- /dev/null +++ b/scripts/task4_remote_access_report.sh @@ -0,0 +1,172 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPORT_AUTHOR="${REPORT_AUTHOR:-Миленькова Ивана}" +ROOT="reports/task4" +LOG_DIR="$ROOT/logs" +IMG_DIR="$ROOT/images" +STATE_DIR="$ROOT/state" +KEY_PATH="$STATE_DIR/task4_demo_ed25519" +DEMO_PASSWORD="${DEMO_PASSWORD:-LabPassw0rd!}" +mkdir -p "$LOG_DIR" "$IMG_DIR" "$STATE_DIR" + +run_capture() { + local key="$1"; shift + { + echo "$ $*" + bash -lc "$*" + } >"$LOG_DIR/${key}.txt" 2>&1 || true + python3 scripts/text_to_png.py "$LOG_DIR/${key}.txt" "$IMG_DIR/${key}.png" --title "$key" +} + +note_capture() { + local key="$1" + local title="$2" + local body="$3" + printf '%s\n' "$body" >"$LOG_DIR/${key}.txt" + python3 scripts/text_to_png.py "$LOG_DIR/${key}.txt" "$IMG_DIR/${key}.png" --title "$title" +} + +RUNNER_USER="$(id -un)" +RUNNER_HOME="$(getent passwd "$RUNNER_USER" | cut -d: -f6)" +HOST_IP="$(hostname -I | awk '{print $1}')" + +run_capture 01_install_ssh "sudo apt-get update && sudo apt-get install -y openssh-server sshpass" +run_capture 02_detect_ip "hostname -I && ip -brief address show" +run_capture 03_start_ssh "sudo mkdir -p /run/sshd && sudo service ssh start && sudo service ssh status || sudo systemctl status ssh --no-pager" +run_capture 04_prepare_password_demo "echo '${RUNNER_USER}:${DEMO_PASSWORD}' | sudo chpasswd && sudo grep -E '^(PubkeyAuthentication|PasswordAuthentication)' /etc/ssh/sshd_config || true" +run_capture 05_password_login "sshpass -p '${DEMO_PASSWORD}' ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${RUNNER_USER}@${HOST_IP} 'whoami && hostname && echo Connected_with_password'" +run_capture 06_generate_ssh_keys "rm -f '${KEY_PATH}' '${KEY_PATH}.pub' && ssh-keygen -t ed25519 -N '' -f '${KEY_PATH}' -C 'task4-demo-key' && ls -l '${KEY_PATH}'* && cat '${KEY_PATH}.pub'" +run_capture 07_enable_key_auth "install -d -m 700 '${RUNNER_HOME}/.ssh' && cat '${KEY_PATH}.pub' >> '${RUNNER_HOME}/.ssh/authorized_keys' && chmod 600 '${RUNNER_HOME}/.ssh/authorized_keys' && tail -n 1 '${RUNNER_HOME}/.ssh/authorized_keys'" +run_capture 08_key_login "ssh -i '${KEY_PATH}' -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${RUNNER_USER}@${HOST_IP} 'whoami && hostname && echo Connected_with_key'" + +note_capture 09_windows_powershell "windows_powershell" "PowerShell (Windows)\n--------------------\n1. Узнать IP Linux ВМ можно командой: hostname -I\n2. Подключение по паролю из Windows PowerShell:\n ssh ${RUNNER_USER}@${HOST_IP}\n3. Генерация ключей на Windows:\n ssh-keygen -t ed25519\n4. Копирование ключа на Linux:\n type \$env:USERPROFILE\\.ssh\\id_ed25519.pub | ssh ${RUNNER_USER}@${HOST_IP} 'umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys'\n5. Повторное подключение без пароля:\n ssh ${RUNNER_USER}@${HOST_IP}" + +run_capture 10_install_rdp "sudo apt-get install -y xrdp xorgxrdp" +run_capture 11_start_rdp "sudo adduser xrdp ssl-cert && sudo service xrdp start && sudo service xrdp status || sudo systemctl status xrdp --no-pager" +run_capture 12_check_rdp_port "sudo ss -tulpn | grep 3389 || true" + +note_capture 13_windows_rdp "windows_rdp" "RDP (Windows)\n-------------\n1. На Windows нажмите Win+R и выполните: mstsc\n2. В поле Computer укажите: ${HOST_IP}\n3. Нажмите Connect и введите логин Linux-пользователя: ${RUNNER_USER}\n4. После входа будет открыт удалённый рабочий стол через xrdp.\n5. Если используется нестандартный порт, укажите адрес в формате ${HOST_IP}:3389" + +cat > "$ROOT/report.json" <