Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

GitHub Action that copy files and artifacts via SSH.

License

NotificationsYou must be signed in to change notification settings

appleboy/scp-action

Use this GitHub action with your project
Add this Action to an existing workflow or create a new one
View on Marketplace

Repository files navigation

繁體中文 |简体中文

GitHub Action for copying files and artifacts via SSH.

v1 versionlint and test

Note: Only supportsLinuxdocker 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


🚀 Quick Start

Copy files and artifacts via SSH in your GitHub Actions workflow:

name:scp fileson:[push]jobs:build:runs-on:ubuntu-lateststeps:      -uses:actions/checkout@v4      -name:Copy files via SSHuses:appleboy/scp-action@v1with: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

VariableDescriptionDefaultRequired
hostRemote host(s), comma-separated for multiple-
portSSH port22
usernameSSH username-
passwordSSH password (prefer SSH key for security)-
keySSH private key content-
key_pathPath to SSH private key file-
passphrasePassphrase for SSH private key-
fingerprintSHA256 fingerprint for host key verification-
protocolIP protocol: 'tcp', 'tcp4', or 'tcp6'tcp
timeoutSSH connection timeout30s
command_timeoutSCP command timeout10m

📁 File Transfer Settings

VariableDescriptionDefaultSecurity Note
sourceLocal files/directories to transfer (comma-separated)-Use explicit paths
targetTarget directory on remote server (must be a directory)-Avoid root directories
rmRemove target directory before upload-Use with caution
strip_componentsRemove leading path elements when extracting-
overwriteOverwrite existing files with tar-
tar_dereferenceFollow symlinks with tar-
tar_tmp_pathTemp path for tar file on destination-
tar_execPath to tar executable on destinationtar
debugEnable debug output-
curl_insecureUse --insecure with curlfalseNot recommended
capture_stdoutCapture command stdout as action outputfalse
versionVersion of drone-scp to use-

🌐 Proxy Settings

VariableDescriptionDefaultRequired
proxy_hostSSH proxy host-
proxy_portSSH proxy port22
proxy_usernameSSH proxy username-
proxy_passwordSSH proxy password-
proxy_keySSH proxy private key content-
proxy_key_pathPath to SSH proxy private key file-
proxy_passphrasePassphrase for SSH proxy private key-
proxy_fingerprintSHA256 fingerprint for proxy host-
proxy_use_insecure_cipherEnable less secure ciphers for proxy-
proxy_timeoutSSH proxy connection timeout30s

🛡️ Best Practices & Security

  • Prefer SSH key authentication over passwords for better security.
  • Store all sensitive values (host, username, password, key) inGitHub Secrets.
  • Regularlyrotate 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

ScenarioLinux ServerWindows Server
Path Format/path/to/dir/c/path/to/dir
Required SettingNonetar_dereference: true
PermissionsPreservedMay require manual ACL
Shellbash (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/...)
  • Enabletar_dereference for symlink handling

💡 Usage Examples

🧩 Scenario Guide


Example 1: Basic SSH Password

-name:Copy file via SSH passworduses:appleboy/scp-action@v1with:host:example.comusername:foopassword:barport:22source:"tests/a.txt,tests/b.txt"target:your_server_target_folder_path

Example 2: Multi-server

-name:Copy to multiple serversuses:appleboy/scp-action@v1with:host:"foo.com,bar.com"username:foopassword:barport:22source:"tests/a.txt,tests/b.txt"target:your_server_target_folder_path

Example 3: Changed Files Only

-name:Get changed filesid:changed-filesuses:tj-actions/changed-files@v35with:since_last_remote_commit:trueseparator:","-name:Copy changed files to serveruses:appleboy/scp-action@v1with: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

-uses:actions/upload-artifact@v4with:name:my-artifactpath:world.txt-uses:actions/download-artifact@v4with:name:my-artifactpath:distfiles-name:Copy artifact to serveruses:appleboy/scp-action@v1with:host:${{ secrets.HOST }}username:${{ secrets.USERNAME }}key:${{ secrets.KEY }}port:${{ secrets.PORT }}source:distfiles/*target:your_server_target_folder_path

Example 5: Windows Server

-name:Copy to Windowsuses:appleboy/scp-action@v1with:host:${{ secrets.HOST }}username:${{ secrets.USERNAME }}key:${{ secrets.SSH_PRIVATE_KEY }}port:22source:"your_source_path"target:"/c/path/to/target/"tar_dereference:truerm:true

🗝️ SSH Key Setup

  1. Generate SSH Key (on your local machine):

    # RSAssh-keygen -t rsa -b 4096 -C"your_email@example.com"# ED25519ssh-keygen -t ed25519 -a 200 -C"your_email@example.com"
  2. Add Public Key to Server:

    cat .ssh/id_rsa.pub| ssh user@host'cat >> .ssh/authorized_keys'# or for ed25519cat .ssh/id_ed25519.pub| ssh user@host'cat >> .ssh/authorized_keys'
  3. Copy Private Key Content to GitHub Secrets:

    clip<~/.ssh/id_rsa# orclip<~/.ssh/id_ed25519

SeeSSH login without password for more details.

OpenSSH Note:
If you seessh: 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/:

CASignatureAlgorithms +ssh-rsa

Or use ed25519 keys, which are accepted by default.


🧰 Common Error Codes

Error CodePossible CauseSolution
ECONNREFUSEDWrong port / firewall blocksCheck port and firewall settings
ENOENTSource file not foundUse absolute path or check checkout step
EAUTHAuthentication failedCheck key format and permissions (PEM format)

🔄 Workflow Diagram

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
Loading

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: Usetj-actions/changed-files to get changed files and pass tosource.

  • 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 enabletar_dereference.


📝 License

MIT License


[8]ページ先頭

©2009-2025 Movatter.jp