From 2375e4541b3650cdd15cc748e0ff007b041bbbed Mon Sep 17 00:00:00 2001 From: Kai Date: Mon, 21 Sep 2026 00:20:31 +0800 Subject: [PATCH] first commit --- .github/FUNDING.yml | 13 ++ .github/dependabot.yml | 10 + .github/workflows/goreleaser.yml | 33 +++ .github/workflows/stable.yml | 150 +++++++++++++ .github/workflows/testing.yml | 150 +++++++++++++ .github/workflows/trivy.yml | 50 +++++ .goreleaser.yaml | 28 +++ LICENSE | 21 ++ README.md | 348 +++++++++++++++++++++++++++++++ README.zh-cn.md | 348 +++++++++++++++++++++++++++++++ README.zh-tw.md | 348 +++++++++++++++++++++++++++++++ action.yml | 142 +++++++++++++ entrypoint.sh | 60 ++++++ images/copy-multiple-file.png | Bin 0 -> 97223 bytes tests/a.txt | 2 + tests/b.txt | 2 + tests/c.txt | 3 + tests/d.txt | 3 + 18 files changed, 1711 insertions(+) create mode 100644 .github/FUNDING.yml create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/goreleaser.yml create mode 100644 .github/workflows/stable.yml create mode 100644 .github/workflows/testing.yml create mode 100644 .github/workflows/trivy.yml create mode 100644 .goreleaser.yaml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.zh-cn.md create mode 100644 README.zh-tw.md create mode 100644 action.yml create mode 100755 entrypoint.sh create mode 100644 images/copy-multiple-file.png create mode 100644 tests/a.txt create mode 100644 tests/b.txt create mode 100644 tests/c.txt create mode 100644 tests/d.txt diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..df9ae63 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: ['https://www.paypal.me/appleboy46'] diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..632e8eb --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + - package-ecosystem: gomod + directory: / + schedule: + interval: weekly diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml new file mode 100644 index 0000000..afc9600 --- /dev/null +++ b/.github/workflows/goreleaser.yml @@ -0,0 +1,33 @@ +name: Goreleaser + +on: + push: + tags: + - "*" + +permissions: + contents: write + +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - name: Setup go + uses: actions/setup-go@v7 + with: + go-version: "^1" + + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v7 + with: + # either 'goreleaser' (default) or 'goreleaser-pro' + distribution: goreleaser + version: latest + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/stable.yml b/.github/workflows/stable.yml new file mode 100644 index 0000000..c4665a5 --- /dev/null +++ b/.github/workflows/stable.yml @@ -0,0 +1,150 @@ +name: v1 version +on: [push] +jobs: + testing: + name: test scp action + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - name: copy file via ssh password + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "test" + + - name: copy file via ssh key + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "test" + + - name: remove the specified number of leading path elements + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "foobar" + strip_components: 1 + + - name: ssh key with passphrase + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH2 }} + passphrase: ${{ secrets.PASSPHRASE }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "test" + + - name: use insecure cipher + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH2 }} + passphrase: ${{ secrets.PASSPHRASE }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "test" + use_insecure_cipher: true + + deploy: + name: test deploy artifact + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - run: echo hello > world.txt + + - uses: actions/upload-artifact@v7 + with: + name: my-artifact + path: world.txt + + - uses: actions/download-artifact@v8 + with: + name: my-artifact + path: distfiles + + - name: copy file to server + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: distfiles/* + target: test + + changes: + name: test changed-files + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v47 + with: + since_last_remote_commit: true + separator: "," + + - name: copy file to server + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: ${{ steps.changed-files.outputs.all_changed_files }} + target: test + + target: + name: test target folder + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - name: copy file to server + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: tests/a.txt,tests/b.txt + target: foobar foobar 1234 + + multipleHost: + name: test Multiple Host + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - name: copy file to server + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }}:${{ secrets.PORT }},${{ secrets.HOST }}:${{ secrets.PORT }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: 1024 + source: tests/a.txt,tests/b.txt + target: foobar diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 0000000..be05e5a --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,150 @@ +name: lint and test +on: [push] +jobs: + testing: + name: test scp action + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - name: copy file via ssh password + uses: ./ + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "test" + + - name: copy file via ssh key + uses: ./ + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "test" + + - name: remove the specified number of leading path elements + uses: ./ + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "foobar" + strip_components: 1 + + - name: ssh key with passphrase + uses: ./ + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH2 }} + passphrase: ${{ secrets.PASSPHRASE }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "test" + + - name: use insecure cipher + uses: ./ + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH2 }} + passphrase: ${{ secrets.PASSPHRASE }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: "test" + use_insecure_cipher: true + + deploy: + name: test deploy artifact + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - run: echo hello > world.txt + + - uses: actions/upload-artifact@v7 + with: + name: my-artifact + path: world.txt + + - uses: actions/download-artifact@v8 + with: + name: my-artifact + path: distfiles + + - name: copy file to server + uses: ./ + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: distfiles/* + target: test + + changes: + name: test changed-files + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v47 + with: + since_last_remote_commit: true + separator: "," + + - name: copy file to server + uses: ./ + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: ${{ steps.changed-files.outputs.all_changed_files }} + target: test + + target: + name: test target folder + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - name: copy file to server + uses: ./ + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: tests/a.txt,tests/b.txt + target: foobar foobar 1234 + + multipleHost: + name: test Multiple Host + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v7 + + - name: copy file to server + uses: ./ + with: + host: ${{ secrets.HOST }}:${{ secrets.PORT }},${{ secrets.HOST }}:${{ secrets.PORT }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: 1024 + source: tests/a.txt,tests/b.txt + target: foobar diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml new file mode 100644 index 0000000..842679c --- /dev/null +++ b/.github/workflows/trivy.yml @@ -0,0 +1,50 @@ +name: Trivy Security Scan + +on: + schedule: + # Run at 00:00 on day 1 of every 3rd month (January, April, July, October) + - cron: "0 0 1 */3 *" + workflow_dispatch: # Allow manual trigger + push: + branches: + - master + pull_request: + branches: + - master + +permissions: + contents: read + security-events: write # For uploading results to GitHub Security tab + +jobs: + trivy-scan: + name: Trivy Security Scan + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v7 + + - name: Run Trivy vulnerability scanner in repo mode + uses: aquasecurity/trivy-action@v0.36.0 + with: + scan-type: "fs" + scan-ref: "." + format: "sarif" + output: "trivy-results.sarif" + severity: "CRITICAL,HIGH" + + - name: Upload Trivy results to GitHub Security tab + uses: github/codeql-action/upload-sarif@v4 + if: always() + with: + sarif_file: "trivy-results.sarif" + + - name: Run Trivy vulnerability scanner (table output) + uses: aquasecurity/trivy-action@v0.36.0 + with: + scan-type: "fs" + scan-ref: "." + format: "table" + severity: "CRITICAL,HIGH" + exit-code: "1" diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..01b1081 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,28 @@ +builds: + - # If true, skip the build. + # Useful for library projects. + # Default is false + skip: true + +changelog: + use: github + groups: + - title: Features + regexp: "^.*feat[(\\w)]*:+.*$" + order: 0 + - title: "Bug fixes" + regexp: "^.*fix[(\\w)]*:+.*$" + order: 1 + - title: "Enhancements" + regexp: "^.*chore[(\\w)]*:+.*$" + order: 2 + - title: "Refactor" + regexp: "^.*refactor[(\\w)]*:+.*$" + order: 3 + - title: "Build process updates" + regexp: ^.*?(build|ci)(\(.+\))??!?:.+$ + order: 4 + - title: "Documentation updates" + regexp: ^.*?docs?(\(.+\))??!?:.+$ + order: 4 + - title: Others diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dc6b84f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Bo-Yi Wu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb7c683 --- /dev/null +++ b/README.md @@ -0,0 +1,348 @@ +# 🚀 SCP for GitHub Actions + +[繁體中文](README.zh-tw.md) | [简体中文](README.zh-cn.md) + +[GitHub Action](https://github.com/features/actions) for copying files and artifacts via SSH. + +[![v1 version](https://github.com/appleboy/scp-action/actions/workflows/stable.yml/badge.svg)](https://github.com/appleboy/scp-action/actions/workflows/stable.yml) +[![lint and test](https://github.com/appleboy/scp-action/actions/workflows/testing.yml/badge.svg)](https://github.com/appleboy/scp-action/actions/workflows/testing.yml) + +> **Note:** Only supports **Linux** [docker](https://www.docker.com/) containers. + +--- + +## ✨ Features + +- ✅ Copy files and artifacts to one or multiple remote servers via SSH +- ✅ Supports both SSH key and password authentication +- ✅ Full SSH Proxy (jump host) support +- ✅ Handles Linux ↔ Windows path conversion +- ✅ Integrates with GitHub Artifacts workflow +- ✅ Incremental and differential file transfer +- ✅ Rich configuration options for advanced use cases + +--- + +## 📦 Table of Contents + +- [🚀 SCP for GitHub Actions](#-scp-for-github-actions) + - [✨ Features](#-features) + - [📦 Table of Contents](#-table-of-contents) + - [🚀 Quick Start](#-quick-start) + - [⚙️ Configuration](#️-configuration) + - [🔌 Connection Settings](#-connection-settings) + - [📁 File Transfer Settings](#-file-transfer-settings) + - [🌐 Proxy Settings](#-proxy-settings) + - [🛡️ Best Practices \& Security](#️-best-practices--security) + - [🖥️ Cross-Platform Notes](#️-cross-platform-notes) + - [💡 Usage Examples](#-usage-examples) + - [🧩 Scenario Guide](#-scenario-guide) + - [Example 1: Basic SSH Password](#example-1-basic-ssh-password) + - [Example 2: Multi-server](#example-2-multi-server) + - [Example 3: Changed Files Only](#example-3-changed-files-only) + - [Example 4: Artifacts Integration](#example-4-artifacts-integration) + - [Example 5: Windows Server](#example-5-windows-server) + - [🗝️ SSH Key Setup](#️-ssh-key-setup) + - [🧰 Common Error Codes](#-common-error-codes) + - [🔄 Workflow Diagram](#-workflow-diagram) + - [FAQ \& Troubleshooting](#faq--troubleshooting) + - [📝 License](#-license) + +--- + +## 🚀 Quick Start + +Copy files and artifacts via SSH in your GitHub Actions workflow: + +```yaml +name: scp files +on: [push] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Copy files via SSH + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +--- + +## ⚙️ Configuration + +### 🔌 Connection Settings + +| Variable | Description | Default | Required | +| --------------- | -------------------------------------------- | ------- | -------- | +| host | Remote host(s), comma-separated for multiple | - | ✓ | +| port | SSH port | 22 | | +| username | SSH username | - | ✓ | +| password | SSH password (prefer SSH key for security) | - | | +| key | SSH private key content | - | | +| key_path | Path to SSH private key file | - | | +| passphrase | Passphrase for SSH private key | - | | +| fingerprint | SHA256 fingerprint for host key verification | - | | +| protocol | IP protocol: 'tcp', 'tcp4', or 'tcp6' | tcp | | +| timeout | SSH connection timeout | 30s | | +| command_timeout | SCP command timeout | 10m | | + +### 📁 File Transfer Settings + +| Variable | Description | Default | Security Note | +| ---------------- | ------------------------------------------------------- | ------- | ---------------------- | +| source | Local files/directories to transfer (comma-separated) | - | Use explicit paths | +| target | Target directory on remote server (must be a directory) | - | Avoid root directories | +| rm | Remove target directory before upload | - | Use with caution | +| strip_components | Remove leading path elements when extracting | - | | +| overwrite | Overwrite existing files with tar | - | | +| tar_dereference | Follow symlinks with tar | - | | +| tar_tmp_path | Temp path for tar file on destination | - | | +| tar_exec | Path to tar executable on destination | tar | | +| debug | Enable debug output | - | | +| curl_insecure | Use --insecure with curl | false | Not recommended | +| capture_stdout | Capture command stdout as action output | false | | +| version | Version of drone-scp to use | - | | + +### 🌐 Proxy Settings + +| Variable | Description | Default | Required | +| ------------------------- | ------------------------------------ | ------- | -------- | +| proxy_host | SSH proxy host | - | | +| proxy_port | SSH proxy port | 22 | | +| proxy_username | SSH proxy username | - | | +| proxy_password | SSH proxy password | - | | +| proxy_key | SSH proxy private key content | - | | +| proxy_key_path | Path to SSH proxy private key file | - | | +| proxy_passphrase | Passphrase for SSH proxy private key | - | | +| proxy_fingerprint | SHA256 fingerprint for proxy host | - | | +| proxy_use_insecure_cipher | Enable less secure ciphers for proxy | - | | +| proxy_timeout | SSH proxy connection timeout | 30s | | + +--- + +## 🛡️ Best Practices & Security + +- **Prefer SSH key authentication** over passwords for better security. +- Store all sensitive values (host, username, password, key) in **GitHub Secrets**. +- Regularly **rotate deployment keys** (suggested every 90 days). +- Restrict write permissions on the target server directory. +- Enable host key fingerprint verification to prevent MITM attacks. +- Avoid using root as the SSH user. + +--- + +## 🖥️ Cross-Platform Notes + +| Scenario | Linux Server | Windows Server | +| ---------------- | -------------- | ----------------------- | +| Path Format | `/path/to/dir` | `/c/path/to/dir` | +| Required Setting | None | `tar_dereference: true` | +| Permissions | Preserved | May require manual ACL | +| Shell | bash (default) | Git Bash via OpenSSH | + +> 🚩 **Important:** +> When copying to Windows servers: +> +> - Install Git for Windows and set OpenSSH default shell to Git Bash +> - Use Unix-style target paths (e.g., `/c/Users/...`) +> - Enable `tar_dereference` for symlink handling + +--- + +## 💡 Usage Examples + +### 🧩 Scenario Guide + +- **Basic file transfer** → [Example 1](#example-1-basic-ssh-password) +- **Multi-server deployment** → [Example 2](#example-2-multi-server) +- **Incremental/changed files only** → [Example 3](#example-3-changed-files-only) +- **Artifacts integration** → [Example 4](#example-4-artifacts-integration) +- **Windows server setup** → [Example 5](#example-5-windows-server) + +--- + +#### Example 1: Basic SSH Password + +```yaml +- name: Copy file via SSH password + uses: appleboy/scp-action@v1 + with: + host: example.com + username: foo + password: bar + port: 22 + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +#### Example 2: Multi-server + +```yaml +- name: Copy to multiple servers + uses: appleboy/scp-action@v1 + with: + host: "foo.com,bar.com" + username: foo + password: bar + port: 22 + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +#### Example 3: Changed Files Only + +```yaml +- name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v35 + with: + since_last_remote_commit: true + separator: "," + +- name: Copy changed files to server + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: ${{ steps.changed-files.outputs.all_changed_files }} + target: your_server_target_folder_path +``` + +#### Example 4: Artifacts Integration + +```yaml +- uses: actions/upload-artifact@v4 + with: + name: my-artifact + path: world.txt + +- uses: actions/download-artifact@v4 + with: + name: my-artifact + path: distfiles + +- name: Copy artifact to server + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: distfiles/* + target: your_server_target_folder_path +``` + +#### Example 5: Windows Server + +```yaml +- name: Copy to Windows + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: 22 + source: "your_source_path" + target: "/c/path/to/target/" + tar_dereference: true + rm: true +``` + +--- + +## 🗝️ SSH Key Setup + +1. **Generate SSH Key** (on your local machine): + + ```bash + # RSA + ssh-keygen -t rsa -b 4096 -C "your_email@example.com" + # ED25519 + ssh-keygen -t ed25519 -a 200 -C "your_email@example.com" + ``` + +2. **Add Public Key to Server**: + + ```bash + cat .ssh/id_rsa.pub | ssh user@host 'cat >> .ssh/authorized_keys' + # or for ed25519 + cat .ssh/id_ed25519.pub | ssh user@host 'cat >> .ssh/authorized_keys' + ``` + +3. **Copy Private Key Content to GitHub Secrets**: + + ```bash + clip < ~/.ssh/id_rsa + # or + clip < ~/.ssh/id_ed25519 + ``` + +> See [SSH login without password](http://www.linuxproblem.org/art_9.html) for more details. + +**OpenSSH Note:** +If you see `ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]`, ensure your key algorithm is supported. +On Ubuntu 20.04+, add to `/etc/ssh/sshd_config` or `/etc/ssh/sshd_config.d/`: + +```sh +CASignatureAlgorithms +ssh-rsa +``` + +Or use ed25519 keys, which are accepted by default. + +--- + +## 🧰 Common Error Codes + +| Error Code | Possible Cause | Solution | +| -------------- | ---------------------------- | --------------------------------------------- | +| `ECONNREFUSED` | Wrong port / firewall blocks | Check port and firewall settings | +| `ENOENT` | Source file not found | Use absolute path or check checkout step | +| `EAUTH` | Authentication failed | Check key format and permissions (PEM format) | + +--- + +## 🔄 Workflow Diagram + +```mermaid +sequenceDiagram + participant G as GitHub Runner + participant S as Target Server + G->>S: Establish SSH connection + S-->>G: Authenticate credentials + G->>S: (Optional) Remove target directory + G->>G: Archive source files + G->>S: Transfer archive + S->>S: Extract and process files + S-->>G: Return result +``` + +--- + +## FAQ & Troubleshooting + +- **Q: Why does authentication fail?** + A: Check SSH key format, permissions, and that the key is added to the server. + +- **Q: How do I copy only changed files?** + A: Use `tj-actions/changed-files` to get changed files and pass to `source`. + +- **Q: How to deploy to multiple servers?** + A: Use comma-separated host list: `host: "foo.com,bar.com"` + +- **Q: How to copy to Windows?** + A: Set up Git Bash, use Unix-style paths, and enable `tar_dereference`. + +--- + +## 📝 License + +MIT License diff --git a/README.zh-cn.md b/README.zh-cn.md new file mode 100644 index 0000000..4fe61eb --- /dev/null +++ b/README.zh-cn.md @@ -0,0 +1,348 @@ +# 🚀 GitHub Actions 的 SCP + +[English](README.md) | [繁體中文](README.zh-tw.md) + +[GitHub Action](https://github.com/features/actions) 用于通过 SSH 复制文件和构建产物。 + +[![v1 version](https://github.com/appleboy/scp-action/actions/workflows/stable.yml/badge.svg)](https://github.com/appleboy/scp-action/actions/workflows/stable.yml) +[![lint and test](https://github.com/appleboy/scp-action/actions/workflows/testing.yml/badge.svg)](https://github.com/appleboy/scp-action/actions/workflows/testing.yml) + +> **注意:** 仅支持 **Linux** [docker](https://www.docker.com/) 容器。 + +--- + +## ✨ 功能特性 + +- ✅ 通过 SSH 将文件和产物复制到一台或多台远程服务器 +- ✅ 支持 SSH 密钥和密码认证 +- ✅ 完全支持 SSH 代理(跳板机) +- ✅ 处理 Linux ↔ Windows 路径转换 +- ✅ 集成 GitHub Artifacts 工作流 +- ✅ 支持增量与差异文件传输 +- ✅ 丰富的高级配置选项 + +--- + +## 📦 目录 + +- [🚀 GitHub Actions 的 SCP](#-github-actions-的-scp) + - [✨ 功能特性](#-功能特性) + - [📦 目录](#-目录) + - [🚀 快速开始](#-快速开始) + - [⚙️ 配置说明](#️-配置说明) + - [🔌 连接设置](#-连接设置) + - [📁 文件传输设置](#-文件传输设置) + - [🌐 代理设置](#-代理设置) + - [🛡️ 最佳实践与安全性](#️-最佳实践与安全性) + - [🖥️ 跨平台注意事项](#️-跨平台注意事项) + - [💡 使用示例](#-使用示例) + - [🧩 场景导览](#-场景导览) + - [示例 1:基本 SSH 密码](#示例-1基本-ssh-密码) + - [示例 2:多台服务器](#示例-2多台服务器) + - [示例 3:仅传输变更文件](#示例-3仅传输变更文件) + - [示例 4:集成 Artifacts](#示例-4集成-artifacts) + - [示例 5:Windows 服务器](#示例-5windows-服务器) + - [🗝️ SSH 密钥设置](#️-ssh-密钥设置) + - [🧰 常见错误代码](#-常见错误代码) + - [🔄 工作流程图](#-工作流程图) + - [FAQ 与故障排查](#faq-与故障排查) + - [📝 许可证](#-许可证) + +--- + +## 🚀 快速开始 + +在 GitHub Actions 工作流中通过 SSH 复制文件和产物: + +```yaml +name: scp files +on: [push] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: 通过 SSH 复制文件 + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +--- + +## ⚙️ 配置说明 + +### 🔌 连接设置 + +| 变量 | 说明 | 默认值 | 必填 | +| --------------- | -------------------------------- | ------ | ---- | +| host | 远程主机(多台用逗号分隔) | - | ✓ | +| port | SSH 端口 | 22 | | +| username | SSH 用户名 | - | ✓ | +| password | SSH 密码(建议优先使用密钥认证) | - | | +| key | SSH 私钥内容 | - | | +| key_path | SSH 私钥文件路径 | - | | +| passphrase | SSH 私钥密码 | - | | +| fingerprint | 主机密钥 SHA256 指纹验证 | - | | +| protocol | IP 协议:'tcp'、'tcp4' 或 'tcp6' | tcp | | +| timeout | SSH 连接超时 | 30s | | +| command_timeout | SCP 命令超时 | 10m | | + +### 📁 文件传输设置 + +| 变量 | 说明 | 默认值 | 安全性说明 | +| ---------------- | --------------------------------- | ------ | -------------- | +| source | 本地要传输的文件/目录(逗号分隔) | - | 请使用明确路径 | +| target | 远程目标目录(必须为目录) | - | 避免使用根目录 | +| rm | 上传前移除目标目录 | - | 谨慎使用 | +| strip_components | 传输时移除前置路径元素 | - | | +| overwrite | 使用 tar 覆盖现有文件 | - | | +| tar_dereference | tar 传输时跟随符号链接 | - | | +| tar_tmp_path | 目标端 tar 临时文件路径 | - | | +| tar_exec | 目标端 tar 执行文件路径 | tar | | +| debug | 启用调试输出 | - | | +| curl_insecure | curl 使用 --insecure | false | 不推荐 | +| capture_stdout | 将命令 stdout 作为 action 输出 | false | | +| version | 指定 drone-scp 版本 | - | | + +### 🌐 代理设置 + +| 变量 | 说明 | 默认值 | 必填 | +| ------------------------- | -------------------------- | ------ | ---- | +| proxy_host | SSH 代理主机 | - | | +| proxy_port | SSH 代理端口 | 22 | | +| proxy_username | SSH 代理用户名 | - | | +| proxy_password | SSH 代理密码 | - | | +| proxy_key | SSH 代理私钥内容 | - | | +| proxy_key_path | SSH 代理私钥文件路径 | - | | +| proxy_passphrase | SSH 代理私钥密码 | - | | +| proxy_fingerprint | 代理主机 SHA256 指纹验证 | - | | +| proxy_use_insecure_cipher | 启用较不安全的代理加密算法 | - | | +| proxy_timeout | SSH 代理连接超时 | 30s | | + +--- + +## 🛡️ 最佳实践与安全性 + +- **建议优先使用 SSH 密钥认证**,提升安全性。 +- 将所有敏感信息(host、username、password、key)存放于 **GitHub Secrets**。 +- 定期**更换部署密钥**(建议每 90 天一次)。 +- 限制目标服务器目录的写入权限。 +- 启用主机密钥指纹验证以防止中间人攻击。 +- 避免使用 root 用户登录 SSH。 + +--- + +## 🖥️ 跨平台注意事项 + +| 场景 | Linux 服务器 | Windows 服务器 | +| -------- | -------------- | ----------------------- | +| 路径格式 | `/path/to/dir` | `/c/path/to/dir` | +| 必要设置 | 无 | `tar_dereference: true` | +| 权限 | 保留 | 可能需手动设置 ACL | +| Shell | bash(默认) | Git Bash(OpenSSH) | + +> 🚩 **重要提醒:** +> 复制到 Windows 服务器时: +> +> - 安装 Git for Windows 并将 OpenSSH 默认 shell 设为 Git Bash +> - 使用类 Unix 目标路径(如 `/c/Users/...`) +> - 启用 `tar_dereference` 处理符号链接 + +--- + +## 💡 使用示例 + +### 🧩 场景导览 + +- **基本文件传输** → [示例 1](#示例-1基本-ssh-密码) +- **多台服务器部署** → [示例 2](#示例-2多台服务器) +- **仅传输变更文件** → [示例 3](#示例-3仅传输变更文件) +- **集成 Artifacts** → [示例 4](#示例-4集成-artifacts) +- **Windows 服务器设置** → [示例 5](#示例-5windows-服务器) + +--- + +#### 示例 1:基本 SSH 密码 + +```yaml +- name: 通过 SSH 密码复制文件 + uses: appleboy/scp-action@v1 + with: + host: example.com + username: foo + password: bar + port: 22 + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +#### 示例 2:多台服务器 + +```yaml +- name: 复制到多台服务器 + uses: appleboy/scp-action@v1 + with: + host: "foo.com,bar.com" + username: foo + password: bar + port: 22 + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +#### 示例 3:仅传输变更文件 + +```yaml +- name: 获取变更文件 + id: changed-files + uses: tj-actions/changed-files@v35 + with: + since_last_remote_commit: true + separator: "," + +- name: 复制变更文件到服务器 + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: ${{ steps.changed-files.outputs.all_changed_files }} + target: your_server_target_folder_path +``` + +#### 示例 4:集成 Artifacts + +```yaml +- uses: actions/upload-artifact@v4 + with: + name: my-artifact + path: world.txt + +- uses: actions/download-artifact@v4 + with: + name: my-artifact + path: distfiles + +- name: 复制 artifact 到服务器 + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: distfiles/* + target: your_server_target_folder_path +``` + +#### 示例 5:Windows 服务器 + +```yaml +- name: 复制到 Windows + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: 22 + source: "your_source_path" + target: "/c/path/to/target/" + tar_dereference: true + rm: true +``` + +--- + +## 🗝️ SSH 密钥设置 + +1. **生成 SSH 密钥**(在本地执行): + + ```bash + # RSA + ssh-keygen -t rsa -b 4096 -C "your_email@example.com" + # ED25519 + ssh-keygen -t ed25519 -a 200 -C "your_email@example.com" + ``` + +2. **将公钥添加到服务器**: + + ```bash + cat .ssh/id_rsa.pub | ssh user@host 'cat >> .ssh/authorized_keys' + # 或 ed25519 + cat .ssh/id_ed25519.pub | ssh user@host 'cat >> .ssh/authorized_keys' + ``` + +3. **将私钥内容复制到 GitHub Secrets**: + + ```bash + clip < ~/.ssh/id_rsa + # 或 + clip < ~/.ssh/id_ed25519 + ``` + +> 更多细节请参考 [SSH 免密登录](http://www.linuxproblem.org/art_9.html)。 + +**OpenSSH 注意事项:** +如遇到 `ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]`,请确认密钥算法已被支持。 +Ubuntu 20.04+ 可在 `/etc/ssh/sshd_config` 或 `/etc/ssh/sshd_config.d/` 添加: + +```sh +CASignatureAlgorithms +ssh-rsa +``` + +或使用 ed25519 密钥(默认支持)。 + +--- + +## 🧰 常见错误代码 + +| 错误代码 | 可能原因 | 解决方法 | +| -------------- | ------------------- | --------------------------------- | +| `ECONNREFUSED` | 端口错误/防火墙阻挡 | 检查端口和防火墙设置 | +| `ENOENT` | 找不到源文件 | 使用绝对路径或检查 checkout 步骤 | +| `EAUTH` | 认证失败 | 检查密钥格式和权限(需 PEM 格式) | + +--- + +## 🔄 工作流程图 + +```mermaid +sequenceDiagram + participant G as GitHub Runner + participant S as Target Server + G->>S: 建立 SSH 连接 + S-->>G: 验证凭证 + G->>S: (可选)移除目标目录 + G->>G: 打包源文件 + G->>S: 传输打包文件 + S->>S: 解压和处理文件 + S-->>G: 返回结果 +``` + +--- + +## FAQ 与故障排查 + +- **Q: 为什么认证失败?** + A: 请检查 SSH 密钥格式、权限,以及密钥是否已添加到服务器。 + +- **Q: 如何只复制变更文件?** + A: 使用 `tj-actions/changed-files` 获取变更文件并传递给 `source`。 + +- **Q: 如何部署到多台服务器?** + A: `host` 参数用逗号分隔多台主机,例如:`host: "foo.com,bar.com"` + +- **Q: 如何复制到 Windows?** + A: 设置 Git Bash,使用类 Unix 路径,并启用 `tar_dereference`。 + +--- + +## 📝 许可证 + +MIT License diff --git a/README.zh-tw.md b/README.zh-tw.md new file mode 100644 index 0000000..9b39b42 --- /dev/null +++ b/README.zh-tw.md @@ -0,0 +1,348 @@ +# 🚀 GitHub Actions 的 SCP + +[English](README.md) | [简体中文](README.zh-cn.md) + +[GitHub Action](https://github.com/features/actions) 用於透過 SSH 複製檔案與產物。 + +[![v1 version](https://github.com/appleboy/scp-action/actions/workflows/stable.yml/badge.svg)](https://github.com/appleboy/scp-action/actions/workflows/stable.yml) +[![lint and test](https://github.com/appleboy/scp-action/actions/workflows/testing.yml/badge.svg)](https://github.com/appleboy/scp-action/actions/workflows/testing.yml) + +> **注意:** 只支援 **Linux** [docker](https://www.docker.com/) 容器。 + +--- + +## ✨ 功能特色 + +- ✅ 透過 SSH 將檔案與產物複製到一台或多台遠端伺服器 +- ✅ 支援 SSH 金鑰與密碼驗證 +- ✅ 完整支援 SSH Proxy(跳板機) +- ✅ 處理 Linux ↔ Windows 路徑轉換 +- ✅ 整合 GitHub Artifacts 工作流程 +- ✅ 支援增量與差異檔案傳輸 +- ✅ 豐富的進階設定選項 + +--- + +## 📦 目錄 + +- [🚀 GitHub Actions 的 SCP](#-github-actions-的-scp) + - [✨ 功能特色](#-功能特色) + - [📦 目錄](#-目錄) + - [🚀 快速開始](#-快速開始) + - [⚙️ 設定說明](#️-設定說明) + - [🔌 連線設定](#-連線設定) + - [📁 檔案傳輸設定](#-檔案傳輸設定) + - [🌐 Proxy 設定](#-proxy-設定) + - [🛡️ 最佳實踐與安全性](#️-最佳實踐與安全性) + - [🖥️ 跨平台注意事項](#️-跨平台注意事項) + - [💡 使用範例](#-使用範例) + - [🧩 情境導覽](#-情境導覽) + - [範例 1:基本 SSH 密碼](#範例-1基本-ssh-密碼) + - [範例 2:多台伺服器](#範例-2多台伺服器) + - [範例 3:僅傳送變更檔案](#範例-3僅傳送變更檔案) + - [範例 4:整合 Artifacts](#範例-4整合-artifacts) + - [範例 5:Windows 伺服器](#範例-5windows-伺服器) + - [🗝️ SSH 金鑰設定](#️-ssh-金鑰設定) + - [🧰 常見錯誤代碼](#-常見錯誤代碼) + - [🔄 工作流程圖](#-工作流程圖) + - [FAQ 與疑難排解](#faq-與疑難排解) + - [📝 授權條款](#-授權條款) + +--- + +## 🚀 快速開始 + +在 GitHub Actions 工作流程中透過 SSH 複製檔案與產物: + +```yaml +name: scp files +on: [push] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: 透過 SSH 複製檔案 + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + port: ${{ secrets.PORT }} + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +--- + +## ⚙️ 設定說明 + +### 🔌 連線設定 + +| 變數 | 說明 | 預設值 | 必填 | +| --------------- | ------------------------------------ | ------ | ---- | +| host | 遠端主機(多台以逗號分隔) | - | ✓ | +| port | SSH 連接埠 | 22 | | +| username | SSH 使用者名稱 | - | ✓ | +| password | SSH 密碼(建議使用金鑰以提升安全性) | - | | +| key | SSH 私鑰內容 | - | | +| key_path | SSH 私鑰檔案路徑 | - | | +| passphrase | SSH 私鑰密碼 | - | | +| fingerprint | 主機金鑰 SHA256 指紋驗證 | - | | +| protocol | IP 協定:'tcp'、'tcp4' 或 'tcp6' | tcp | | +| timeout | SSH 連線逾時 | 30s | | +| command_timeout | SCP 指令逾時 | 10m | | + +### 📁 檔案傳輸設定 + +| 變數 | 說明 | 預設值 | 安全性說明 | +| ---------------- | --------------------------------- | ------ | -------------- | +| source | 本地要傳送的檔案/目錄(逗號分隔) | - | 請使用明確路徑 | +| target | 遠端目標目錄(必須為目錄) | - | 避免使用根目錄 | +| rm | 上傳前移除目標目錄 | - | 請小心使用 | +| strip_components | 傳送時移除前置路徑元素 | - | | +| overwrite | 使用 tar 覆蓋現有檔案 | - | | +| tar_dereference | tar 傳送時跟隨符號連結 | - | | +| tar_tmp_path | 目標端 tar 暫存檔路徑 | - | | +| tar_exec | 目標端 tar 執行檔路徑 | tar | | +| debug | 啟用除錯輸出 | - | | +| curl_insecure | curl 使用 --insecure | false | 不建議 | +| capture_stdout | 將指令 stdout 作為 action 輸出 | false | | +| version | 指定 drone-scp 版本 | - | | + +### 🌐 Proxy 設定 + +| 變數 | 說明 | 預設值 | 必填 | +| ------------------------- | ------------------------------- | ------ | ---- | +| proxy_host | SSH Proxy 主機 | - | | +| proxy_port | SSH Proxy 連接埠 | 22 | | +| proxy_username | SSH Proxy 使用者名稱 | - | | +| proxy_password | SSH Proxy 密碼 | - | | +| proxy_key | SSH Proxy 私鑰內容 | - | | +| proxy_key_path | SSH Proxy 私鑰檔案路徑 | - | | +| proxy_passphrase | SSH Proxy 私鑰密碼 | - | | +| proxy_fingerprint | Proxy 主機 SHA256 指紋驗證 | - | | +| proxy_use_insecure_cipher | 啟用較不安全的 Proxy 加密演算法 | - | | +| proxy_timeout | SSH Proxy 連線逾時 | 30s | | + +--- + +## 🛡️ 最佳實踐與安全性 + +- **建議優先使用 SSH 金鑰驗證**,提升安全性。 +- 將所有敏感資訊(host、username、password、key)存放於 **GitHub Secrets**。 +- 定期**更換部署金鑰**(建議每 90 天一次)。 +- 限制目標伺服器目錄的寫入權限。 +- 啟用主機金鑰指紋驗證以防止中間人攻擊。 +- 避免使用 root 帳號登入 SSH。 + +--- + +## 🖥️ 跨平台注意事項 + +| 情境 | Linux 伺服器 | Windows 伺服器 | +| -------- | -------------- | ----------------------- | +| 路徑格式 | `/path/to/dir` | `/c/path/to/dir` | +| 必要設定 | 無 | `tar_dereference: true` | +| 權限 | 保留 | 可能需手動設定 ACL | +| Shell | bash (預設) | Git Bash(OpenSSH) | + +> 🚩 **重要提醒:** +> 複製到 Windows 伺服器時: +> +> - 安裝 Git for Windows 並將 OpenSSH 預設 shell 設為 Git Bash +> - 使用 Unix 風格目標路徑(如 `/c/Users/...`) +> - 啟用 `tar_dereference` 處理符號連結 + +--- + +## 💡 使用範例 + +### 🧩 情境導覽 + +- **基本檔案傳輸** → [範例 1](#範例-1基本-ssh-密碼) +- **多台伺服器部署** → [範例 2](#範例-2多台伺服器) +- **僅傳送變更檔案** → [範例 3](#範例-3僅傳送變更檔案) +- **整合 Artifacts** → [範例 4](#範例-4整合-artifacts) +- **Windows 伺服器設定** → [範例 5](#範例-5windows-伺服器) + +--- + +#### 範例 1:基本 SSH 密碼 + +```yaml +- name: 透過 SSH 密碼複製檔案 + uses: appleboy/scp-action@v1 + with: + host: example.com + username: foo + password: bar + port: 22 + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +#### 範例 2:多台伺服器 + +```yaml +- name: 複製到多台伺服器 + uses: appleboy/scp-action@v1 + with: + host: "foo.com,bar.com" + username: foo + password: bar + port: 22 + source: "tests/a.txt,tests/b.txt" + target: your_server_target_folder_path +``` + +#### 範例 3:僅傳送變更檔案 + +```yaml +- name: 取得變更檔案 + id: changed-files + uses: tj-actions/changed-files@v35 + with: + since_last_remote_commit: true + separator: "," + +- name: 複製變更檔案到伺服器 + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: ${{ steps.changed-files.outputs.all_changed_files }} + target: your_server_target_folder_path +``` + +#### 範例 4:整合 Artifacts + +```yaml +- uses: actions/upload-artifact@v4 + with: + name: my-artifact + path: world.txt + +- uses: actions/download-artifact@v4 + with: + name: my-artifact + path: distfiles + +- name: 複製 artifact 到伺服器 + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + source: distfiles/* + target: your_server_target_folder_path +``` + +#### 範例 5:Windows 伺服器 + +```yaml +- name: 複製到 Windows + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: 22 + source: "your_source_path" + target: "/c/path/to/target/" + tar_dereference: true + rm: true +``` + +--- + +## 🗝️ SSH 金鑰設定 + +1. **產生 SSH 金鑰**(於本地端執行): + + ```bash + # RSA + ssh-keygen -t rsa -b 4096 -C "your_email@example.com" + # ED25519 + ssh-keygen -t ed25519 -a 200 -C "your_email@example.com" + ``` + +2. **將公鑰加入伺服器**: + + ```bash + cat .ssh/id_rsa.pub | ssh user@host 'cat >> .ssh/authorized_keys' + # 或 ed25519 + cat .ssh/id_ed25519.pub | ssh user@host 'cat >> .ssh/authorized_keys' + ``` + +3. **將私鑰內容複製到 GitHub Secrets**: + + ```bash + clip < ~/.ssh/id_rsa + # 或 + clip < ~/.ssh/id_ed25519 + ``` + +> 更多細節請參考 [SSH 無密碼登入](http://www.linuxproblem.org/art_9.html)。 + +**OpenSSH 注意事項:** +若出現 `ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]`,請確認金鑰演算法支援。 +Ubuntu 20.04+ 可於 `/etc/ssh/sshd_config` 或 `/etc/ssh/sshd_config.d/` 加入: + +```sh +CASignatureAlgorithms +ssh-rsa +``` + +或改用 ed25519 金鑰(預設支援)。 + +--- + +## 🧰 常見錯誤代碼 + +| 錯誤代碼 | 可能原因 | 解決方式 | +| -------------- | --------------------- | --------------------------------- | +| `ECONNREFUSED` | 連接埠錯誤/防火牆阻擋 | 檢查連接埠與防火牆設定 | +| `ENOENT` | 找不到來源檔案 | 請用絕對路徑或檢查 checkout 步驟 | +| `EAUTH` | 驗證失敗 | 檢查金鑰格式與權限(需 PEM 格式) | + +--- + +## 🔄 工作流程圖 + +```mermaid +sequenceDiagram + participant G as GitHub Runner + participant S as Target Server + G->>S: 建立 SSH 連線 + S-->>G: 驗證憑證 + G->>S: (可選)移除目標目錄 + G->>G: 封存來源檔案 + G->>S: 傳送封存檔 + S->>S: 解壓與處理檔案 + S-->>G: 回傳結果 +``` + +--- + +## FAQ 與疑難排解 + +- **Q: 為什麼驗證失敗?** + A: 請檢查 SSH 金鑰格式、權限,以及金鑰是否已加入伺服器。 + +- **Q: 如何只複製變更檔案?** + A: 使用 `tj-actions/changed-files` 取得變更檔案並傳給 `source`。 + +- **Q: 如何部署到多台伺服器?** + A: `host` 參數用逗號分隔多台主機,例如:`host: "foo.com,bar.com"` + +- **Q: 如何複製到 Windows?** + A: 設定 Git Bash,使用 Unix 風格路徑,並啟用 `tar_dereference`。 + +--- + +## 📝 授權條款 + +MIT License diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..e523cb6 --- /dev/null +++ b/action.yml @@ -0,0 +1,142 @@ +name: "SCP Command to Transfer Files" +description: "Easily transfer files and folders using the SCP command in Linux." +author: "Bo-Yi Wu" +inputs: + host: + description: "Remote host address for SCP (e.g., example.com or 192.168.1.1)." + port: + description: "Remote SSH port for SCP. Default: 22." + default: "22" + username: + description: "Username for SSH authentication." + password: + description: "Password for SSH authentication (not recommended; use SSH keys if possible)." + protocol: + description: "IP protocol to use. Valid values: 'tcp', 'tcp4', or 'tcp6'. Default: tcp." + default: "tcp" + timeout: + description: "Timeout for establishing SSH connection to the remote host. Default: 30s." + default: "30s" + command_timeout: + description: "Timeout for the SCP command execution. Default: 10m." + default: "10m" + key: + description: "Content of the SSH private key (e.g., the raw content of ~/.ssh/id_rsa)." + key_path: + description: "Path to the SSH private key file." + passphrase: + description: "Passphrase for the SSH private key, if required." + fingerprint: + description: "SHA256 fingerprint of the host's public key. If not set, host key verification is skipped (not recommended for production)." + use_insecure_cipher: + description: "Enable additional, less secure ciphers for compatibility. Not recommended unless required." + target: + description: "Target directory path on the remote server. Must be a directory." + source: + description: "List of files or directories to transfer (local paths)." + rm: + description: "Remove the target directory on the server before uploading new data." + debug: + description: "Enable debug messages for troubleshooting." + strip_components: + description: "Remove the specified number of leading path elements when extracting files." + overwrite: + description: "Use the --overwrite flag with tar to overwrite existing files." + tar_dereference: + description: "Use the --dereference flag with tar to follow symlinks." + tar_tmp_path: + description: "Temporary path for the tar file on the destination host." + tar_exec: + description: "Path to the tar executable on the destination host. Default: tar." + default: "tar" + proxy_host: + description: "Remote host address for SSH proxy." + proxy_port: + description: "SSH proxy port. Default: 22." + default: "22" + proxy_username: + description: "Username for SSH proxy authentication." + proxy_password: + description: "Password for SSH proxy authentication." + proxy_passphrase: + description: "Passphrase for the SSH proxy private key, if required." + proxy_timeout: + description: "Timeout for establishing SSH connection to the proxy host. Default: 30s." + default: "30s" + proxy_key: + description: "Content of the SSH proxy private key (e.g., the raw content of ~/.ssh/id_rsa)." + proxy_key_path: + description: "Path to the SSH proxy private key file." + proxy_fingerprint: + description: "SHA256 fingerprint of the proxy host's public key. If not set, host key verification is skipped (not recommended for production)." + proxy_use_insecure_cipher: + description: "Enable additional, less secure ciphers for the proxy connection. Not recommended unless required." + curl_insecure: + description: "When true, uses the --insecure option with curl for insecure downloads." + default: "false" + capture_stdout: + description: "When true, captures and returns standard output from the commands as action output." + default: "false" + version: + description: | + The version of drone-scp to use. + +outputs: + stdout: + description: "Standard output of the executed commands when capture_stdout is enabled." + value: ${{ steps.entrypoint.outputs.stdout }} + +runs: + using: "composite" + steps: + - name: Set GitHub Path + run: echo "$GITHUB_ACTION_PATH" >> $GITHUB_PATH + shell: bash + env: + GITHUB_ACTION_PATH: ${{ github.action_path }} + - id: entrypoint + name: Run entrypoint.sh + run: entrypoint.sh + shell: bash + env: + GITHUB_ACTION_PATH: ${{ github.action_path }} + INPUT_HOST: ${{ inputs.host }} + INPUT_PORT: ${{ inputs.port }} + INPUT_PROTOCOL: ${{ inputs.protocol }} + INPUT_USERNAME: ${{ inputs.username }} + INPUT_PASSWORD: ${{ inputs.password }} + INPUT_PASSPHRASE: ${{ inputs.passphrase }} + INPUT_KEY: ${{ inputs.key }} + INPUT_KEY_PATH: ${{ inputs.key_path }} + INPUT_FINGERPRINT: ${{ inputs.fingerprint }} + INPUT_PROXY_HOST: ${{ inputs.proxy_host }} + INPUT_PROXY_PORT: ${{ inputs.proxy_port }} + INPUT_PROXY_USERNAME: ${{ inputs.proxy_username }} + INPUT_PROXY_PASSWORD: ${{ inputs.proxy_password }} + INPUT_PROXY_PASSPHRASE: ${{ inputs.proxy_passphrase }} + INPUT_PROXY_KEY: ${{ inputs.proxy_key }} + INPUT_PROXY_KEY_PATH: ${{ inputs.proxy_key_path }} + INPUT_PROXY_FINGERPRINT: ${{ inputs.proxy_fingerprint }} + INPUT_USE_INSECURE_CIPHER: ${{ inputs.use_insecure_cipher }} + INPUT_CIPHER: ${{ inputs.cipher }} + INPUT_PROXY_USE_INSECURE_CIPHER: ${{ inputs.proxy_use_insecure_cipher }} + INPUT_PROXY_CIPHER: ${{ inputs.proxy_cipher }} + INPUT_DEBUG: ${{ inputs.debug }} + INPUT_TIMEOUT: ${{ inputs.timeout }} + INPUT_COMMAND_TIMEOUT: ${{ inputs.command_timeout }} + INPUT_TARGET: ${{ inputs.target }} + INPUT_SOURCE: ${{ inputs.source }} + INPUT_RM: ${{ inputs.rm }} + INPUT_STRIP_COMPONENTS: ${{ inputs.strip_components }} + INPUT_OVERWRITE: ${{ inputs.overwrite }} + INPUT_TAR_DEREFERENCE: ${{ inputs.tar_dereference }} + INPUT_TAR_TMP_PATH: ${{ inputs.tar_tmp_path }} + INPUT_TAR_EXEC: ${{ inputs.tar_exec }} + INPUT_PROXY_TIMEOUT: ${{ inputs.proxy_timeout }} + INPUT_CAPTURE_STDOUT: ${{ inputs.capture_stdout }} + INPUT_CURL_INSECURE: ${{ inputs.curl_insecure }} + DRONE_SCP_VERSION: ${{ inputs.version }} + +branding: + icon: "copy" + color: "gray-dark" diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..f9449e8 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +set -euo pipefail + +export GITHUB="true" + +GITHUB_ACTION_PATH="${GITHUB_ACTION_PATH%/}" +DRONE_SCP_RELEASE_URL="${DRONE_SCP_RELEASE_URL:-https://github.com/appleboy/drone-scp/releases/download}" +DRONE_SCP_VERSION="${DRONE_SCP_VERSION:-1.8.0}" + +function log_error() { + echo "$1" >&2 + exit "$2" +} + +function detect_client_info() { + CLIENT_PLATFORM="${SCP_CLIENT_OS:-$(uname -s | tr '[:upper:]' '[:lower:]')}" + CLIENT_ARCH="${SCP_CLIENT_ARCH:-$(uname -m)}" + + case "${CLIENT_PLATFORM}" in + darwin | linux | windows) ;; + *) log_error "Unknown or unsupported platform: ${CLIENT_PLATFORM}. Supported platforms are Linux, Darwin, and Windows." 2 ;; + esac + + case "${CLIENT_ARCH}" in + x86_64* | i?86_64* | amd64*) CLIENT_ARCH="amd64" ;; + aarch64* | arm64*) CLIENT_ARCH="arm64" ;; + *) log_error "Unknown or unsupported architecture: ${CLIENT_ARCH}. Supported architectures are x86_64, i686, and arm64." 3 ;; + esac +} + +detect_client_info +DOWNLOAD_URL_PREFIX="${DRONE_SCP_RELEASE_URL}/v${DRONE_SCP_VERSION}" +CLIENT_BINARY="drone-scp-${DRONE_SCP_VERSION}-${CLIENT_PLATFORM}-${CLIENT_ARCH}" +TARGET="${GITHUB_ACTION_PATH}/${CLIENT_BINARY}" +echo "Downloading ${CLIENT_BINARY} from ${DOWNLOAD_URL_PREFIX}" +INSECURE_OPTION="" +if [[ "${INPUT_CURL_INSECURE}" == 'true' ]]; then + INSECURE_OPTION="--insecure" +fi + +if [[ ! -x "${TARGET}" ]]; then + curl -fsSL --retry 5 --keepalive-time 2 ${INSECURE_OPTION} "${DOWNLOAD_URL_PREFIX}/${CLIENT_BINARY}" -o "${TARGET}" + chmod +x "${TARGET}" +else + echo "Binary ${CLIENT_BINARY} already exists and is executable, skipping download." +fi + +echo "======= CLI Version Information =======" +"${TARGET}" --version +echo "=======================================" +if [[ "${INPUT_CAPTURE_STDOUT}" == 'true' ]]; then + { + echo 'stdout<>"${GITHUB_OUTPUT}" +else + "${TARGET}" "$@" +fi diff --git a/images/copy-multiple-file.png b/images/copy-multiple-file.png new file mode 100644 index 0000000000000000000000000000000000000000..c062db01c17639aafec96ddee3103190d51735f0 GIT binary patch literal 97223 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 literal 0 HcmV?d00001 diff --git a/tests/a.txt b/tests/a.txt new file mode 100644 index 0000000..4f6c252 --- /dev/null +++ b/tests/a.txt @@ -0,0 +1,2 @@ +foo +foobar diff --git a/tests/b.txt b/tests/b.txt new file mode 100644 index 0000000..c494264 --- /dev/null +++ b/tests/b.txt @@ -0,0 +1,2 @@ +bar +foobar diff --git a/tests/c.txt b/tests/c.txt new file mode 100644 index 0000000..06cab46 --- /dev/null +++ b/tests/c.txt @@ -0,0 +1,3 @@ +c +foobar +test1234 diff --git a/tests/d.txt b/tests/d.txt new file mode 100644 index 0000000..13a80d9 --- /dev/null +++ b/tests/d.txt @@ -0,0 +1,3 @@ +d +foobar +foobar