76 Commits

Author SHA1 Message Date
334f9259f2 chore: update action configuration for greater flexibility (#240)
Some checks failed
remote ssh command / default flag testing (push) Failing after 4s
remote ssh command / testing with envs (push) Failing after 5s
- Update base image version from `1.6.12` to `1.6.13` in Dockerfile
- Add `envs_format` input with flexible configuration in action.yml
- Add a line to README.md pointing to action.yml for more information

fix https://github.com/appleboy/ssh-action/issues/213
2023-04-13 11:15:42 +08:00
6268c80dd6 docs: add external resources to README file
- Add a line linking to Golang and drone-ssh in the README file

Signed-off-by: Bo-Yi.Wu <appleboy.tw@gmail.com>
2023-04-04 17:56:49 +08:00
5f64c95280 chore: improve SSH key handling and documentation
Some checks failed
remote ssh command / Build (push) Failing after 5s
- Upgrade the ssh-action package from version `v0.1.8` to `v0.1.9`
- Update the ssh-keygen command to use `-t ed25519 -a 200 -C` flag with an email address
- Clarify how to pass environment variables as strings in the `env` object
- Add a command to check the fingerprint of an ed25519 key in the README
- Remove duplicate Host entry for `FooServer` in the Chinese version of the README

Signed-off-by: Bo-Yi.Wu <appleboy.tw@gmail.com>
2023-04-04 17:37:29 +08:00
3cd1bcf771 feat: refactor code for parallel execution on multiple hosts (#237)
- Update Dockerfile to use a newer version of `drone-ssh`
- Modify `ci.yml` to use `continue-on-error` instead of commenting out code

fix https://github.com/appleboy/ssh-action/issues/233
2023-04-04 17:25:53 +08:00
6a1b59d972 docs: add chinese 2023-03-03 10:45:48 +08:00
e4a881008d docs(readme): update 2023-03-03 10:26:23 +08:00
51b83ba474 docs: format 2023-03-03 10:22:51 +08:00
495830820f docs: add traditional chinese documentation.
Signed-off-by: Bo-Yi.Wu <appleboy.tw@gmail.com>
2023-02-28 18:12:19 +08:00
b601429988 docs: update to v0.1.8 version
Some checks failed
remote ssh command / Build (push) Failing after 4s
Signed-off-by: Bo-Yi.Wu <appleboy.tw@gmail.com>
2023-02-28 17:18:27 +08:00
ae2bb3c3dc chore(docker): update appleboy/drone-ssh to v1.6.10 version
Signed-off-by: Bo-Yi.Wu <appleboy.tw@gmail.com>
2023-02-28 17:16:13 +08:00
7bf58514db chore(auth): allow set password and private key at same time. (#226) 2023-02-28 17:11:47 +08:00
c1965ddd25 docs: upgrade to v0.1.7
Signed-off-by: Bo-Yi.Wu <appleboy.tw@gmail.com>
2023-01-08 09:13:12 +08:00
d91a1af6f5 Fix(envs): set environment variable instead of bash variable (#209)
Some checks failed
remote ssh command / Build (push) Failing after 5s
2023-01-08 09:08:14 +08:00
4a03da89e5 docs: update to v0.1.6
Some checks failed
remote ssh command / Build (push) Failing after 4s
2022-12-09 10:32:49 +08:00
0d5a3d0e48 test: comment the ED25519 ssh testing 2022-12-09 10:17:11 +08:00
db9be1d5f2 use fixed version in documentation (#199) 2022-12-09 10:16:07 +08:00
9a7da95c8c chore(ssh): upgrade to drone 1.6.5 2022-12-09 10:13:56 +08:00
f23dd5c681 docs(readme): Fix typo (#191) 2022-11-26 18:24:18 +08:00
cc051b07ed Update README.md (#188) 2022-10-17 22:00:39 +08:00
f9010ff7f1 docs: remove FAQ section
Some checks failed
remote ssh command / Build (push) Failing after 4s
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2022-07-29 21:24:53 +08:00
e1116226a0 updated readme envs option in example (#172) 2022-07-29 21:19:55 +08:00
a8d82ec39b Switch to appleboy/drone-ssh:1.6.4 (#171) 2022-07-29 21:19:21 +08:00
f82e23f1a3 updated README to include OpenSSH comments (#161) 2022-07-29 20:58:30 +08:00
ed1f3fc7c1 docs: problem with an EC2 instance
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2022-07-29 20:54:56 +08:00
dce9d565de Update FUNDING.yml 2022-05-28 16:42:12 +08:00
ea5c23a2b5 Enable Sponsor Button 2022-05-26 09:02:47 +08:00
c732d38392 chore: Add global environments
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2022-02-28 07:08:00 +08:00
ba1d4fb0eb chore(CI): show secrets.
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2022-02-06 16:12:37 +08:00
c7671d858f docs: update format
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2022-02-06 15:15:00 +08:00
1a8b3784ea Document setup of SSH host fingerprint validation (#120) 2021-05-15 23:05:07 +08:00
29007ce6fb chore: update ssh key part
part from https://github.com/appleboy/ssh-action/issues/80
2021-05-09 21:11:10 +08:00
e59c0ee97a docu(restructure): update readme structure and add ed25519 ssh key instructions (#113) 2021-04-04 05:59:44 +08:00
c7104ccac4 chore: add ED25519 example 2021-03-06 23:00:38 +08:00
63dd9dd662 chore: replace ADD with COPY 2021-02-13 10:55:57 +08:00
61e292b601 docs: fix typo
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2020-11-17 10:54:18 +08:00
1d1b21ca96 Support multiple host with different port (#94)
Some checks failed
remote ssh command / Build (push) Failing after 3s
2020-11-17 10:51:06 +08:00
9fb11fb1f5 chore(host): support multiple port
https://github.com/appleboy/ssh-action/issues/85

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2020-11-17 10:20:18 +08:00
fd39ef0f18 Update README.md 2020-10-31 07:03:29 +08:00
ffff33f8fe docs: update readme 2020-08-13 01:06:27 +08:00
8bd4933b73 Instructions to use SSH Key (#77) 2020-08-13 01:03:55 +08:00
bf84735fa9 fix: Multiline SSH commands interpreted as single lines
Some checks failed
remote ssh command / Build (push) Failing after 5s
fix https://github.com/appleboy/ssh-action/issues/75
2020-08-08 15:39:00 +08:00
d09b6e0211 chore: try the latest version 2020-08-08 15:34:38 +08:00
3ac4675689 chore: Add Multiline SSH commands interpreted as single lines 2020-08-08 12:26:01 +08:00
269a4479eb chore: Multiline SSH commands interpreted as single lines 2020-08-03 22:15:09 +08:00
a2f91cbad1 (info) Pass env variable as string (#69) 2020-07-08 16:46:24 +08:00
e2cbea5f00 chore: bump drone-ssh to v1.6.1 (#63)
Some checks failed
remote ssh command / Build (push) Failing after 4s
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2020-06-15 16:45:26 +08:00
5711a203b3 fix typo 2020-06-05 09:05:02 +08:00
b315fb5f98 Update README.md 2020-06-05 09:03:15 +08:00
682eb0ddda chore: bump drone-ssh to v1.6.0
Some checks failed
remote ssh command / Build (push) Failing after 4s
2020-05-24 13:59:21 +08:00
03b440e441 docs: add cipher parameter 2020-05-24 13:13:09 +08:00
1cb5cd31c9 chore: update to latest version 2020-05-24 12:09:05 +08:00
c9eebc1cde chore: support use_insecure_cipher (#57)
Some checks failed
remote ssh command / Build (push) Failing after 3s
2020-05-24 10:54:31 +08:00
6b00175bad add support for fingerprint: (#54) 2020-05-19 14:21:26 +08:00
a912e225ec chore: Add limitation in readme 2020-05-08 19:05:53 +08:00
ad6643f705 chore: support ciphers
Some checks failed
remote ssh command / Build (push) Failing after 11s
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2020-04-30 15:56:29 +08:00
26dd2b3a38 chore: upgrade drone-ssh to 1.5.6
Some checks failed
remote ssh command / Build (push) Failing after 6s
2020-04-16 22:24:18 +08:00
122f35dca5 chore: improve ci workflow (#34) 2020-02-13 21:20:15 +08:00
03b5d10ad6 docs: update desctiption 2020-02-13 21:17:09 +08:00
fcfb760891 docs: add GitHub syntax (#30)
see: https://help.github.com/en/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions

fixed: https://github.com/appleboy/ssh-action/issues/28
2020-02-09 11:37:56 +08:00
fd81fae289 chore: echo sha string 2020-02-09 11:29:31 +08:00
242a8e2e57 chore: Add Contexts and expression example 2020-02-09 11:25:59 +08:00
cfe9c45db6 docs: sync parameter (#25) 2020-01-30 22:40:33 +08:00
73767290ca docs: add passphrase example
Some checks failed
remote ssh command / Build (push) Failing after 4s
2019-12-30 19:54:28 +08:00
e5c07fceef support passphrase (#18)
* support passphrase

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2019-12-30 19:50:55 +08:00
d690bdebf8 docs: update multiple env example 2019-12-08 07:16:30 +08:00
f478af9b34 docs: pass multiple environment 2019-12-07 20:19:23 +08:00
d520c19f4f docs: support proxy command (#15)
docs: support proxy command
2019-12-07 20:15:58 +08:00
0dee98b334 docs: support proxy command 2019-12-07 20:05:02 +08:00
9085f3ea5b chore: update default timeout to 10 minutes
Some checks failed
remote ssh command / Build (push) Failing after 5s
2019-11-30 23:01:49 +08:00
696aab4627 fix typos in README.md (#12)
fix typos in README.md
2019-11-23 12:12:53 +08:00
a88f6f2013 fix typos in README.md 2019-11-21 15:53:08 +01:00
6f091cd9e3 chore(ssh): remove comma splitting
Some checks failed
remote ssh command / Build (push) Failing after 4s
fix https://github.com/appleboy/ssh-action/issues/10
2019-11-21 11:10:52 +08:00
aa1ecdd19a update doc
Some checks failed
remote ssh command / Build (push) Failing after 3s
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2019-09-30 16:55:40 +08:00
bffdd4e1f4 chore(ssh): set default port as 22
fix: https://github.com/appleboy/ssh-action/issues/5

Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2019-09-30 16:54:44 +08:00
f4890bec77 update action link
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2019-09-30 11:35:28 +08:00
9aaf218321 docs: update readme 2019-09-29 14:16:47 +08:00
6 changed files with 934 additions and 89 deletions

13
.github/FUNDING.yml vendored Normal file
View File

@ -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: ssh-action
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']

View File

@ -1,13 +1,41 @@
name: remote ssh command
on: [push]
env:
FOO: "BAR"
BAR: "FOO"
jobs:
build:
name: Build
testing01:
name: default flag testing
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v1
- name: correct password but wrong key
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
key: "1234"
port: ${{ secrets.PORT }}
script: whoami
- name: wrong password but correct key
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: "abcdef"
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: whoami
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
@ -16,7 +44,7 @@ jobs:
script: whoami
- name: executing remote ssh commands using ssh key
uses: appleboy/ssh-action@master
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
@ -25,7 +53,7 @@ jobs:
script: whoami
- name: multiple command
uses: appleboy/ssh-action@master
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
@ -35,18 +63,91 @@ jobs:
whoami
ls -al
# - name: stop script if command error
# uses: appleboy/ssh-action@master
- name: stop script if command error
uses: ./
continue-on-error: true
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script_stop: true
sync: true
debug: true
script: |
mkdir abc/def
ls -al
- name: ssh key passphrase
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH2 }}
port: ${{ secrets.PORT }}
passphrase: ${{ secrets.PASSPHRASE }}
script: |
whoami
ls -al
- name: use insecure cipher
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: |
ls \
-lah
use_insecure_cipher: true
# https://github.com/appleboy/ssh-action/issues/75#issuecomment-668314271
- name: Multiline SSH commands interpreted as single lines
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script_stop: true
script: |
ls \
-lah
use_insecure_cipher: true
# https://github.com/appleboy/ssh-action/issues/85
- name: Deployment to multiple hosts with different ports
uses: ./
with:
host: "${{ secrets.HOST }}:${{ secrets.PORT }}"
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: 1024
script_stop: true
script: |
ls \
-lah
use_insecure_cipher: true
# - name: SSH ED25519 Private Key
# uses: ./
# with:
# host: ${{ secrets.HOST }}
# username: ${{ secrets.USERNAME }}
# key: ${{ secrets.KEY }}
# port: ${{ secrets.PORT }}
# script_stop: true
# script: "mkdir abc/def,ls -al"
# host: ${{ secrets.TUNNEL_HOST }}
# username: ${{ secrets.TUNNEL_USERNAME }}
# key: ${{ secrets.ID_ED25519 }}
# port: ${{ secrets.TUNNEL_PORT }}
# script: whoami
testing02:
name: testing with envs
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v1
- name: pass environment
uses: appleboy/ssh-action@master
uses: ./
env:
FOO: "BAR"
with:
@ -56,5 +157,43 @@ jobs:
port: ${{ secrets.PORT }}
envs: FOO
script: |
echo "I am $FOO"
echo "I am $BAR"
echo "I am $FOO, thanks"
echo "I am $BAR, thanks"
- name: pass multiple environment
uses: ./
env:
FOO: "BAR"
BAR: "FOO"
SHA: ${{ github.sha }}
PORT: ${{ secrets.PORT }}
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
envs: FOO,BAR,SHA,PORT
script: |
echo "I am $FOO, thanks"
echo "I am $BAR, thanks"
echo "sha: $SHA"
echo "port: $PORT"
sh test.sh
- name: custom envs format
uses: ./
env:
FOO: "BAR"
AAA: "BBB"
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
envs: FOO,BAR,AAA
envs_format: export TEST_{NAME}={VALUE}
script: |
echo "I am $TEST_FOO, thanks"
echo "I am $TEST_BAR, thanks"
echo "I am $BAR, thanks"
echo "I am $TEST_AAA, thanks"

View File

@ -1,5 +1,5 @@
FROM appleboy/drone-ssh:1.5.2-linux-amd64
FROM ghcr.io/appleboy/drone-ssh:1.6.13
ADD entrypoint.sh /entrypoint.sh
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

330
README.md
View File

@ -1,18 +1,69 @@
# 🚀 SSH for GitHub Actions
[GitHub Action](https://developer.github.com/actions/) for executing remote ssh commands.
[繁體中文](./README.zh-tw.md)
[GitHub Action](https://github.com/features/actions) for executing remote ssh commands.
![ssh workflow](./images/ssh-workflow.png)
[![Actions Status](https://github.com/appleboy/ssh-action/workflows/remote%20ssh%20command/badge.svg)](https://github.com/appleboy/ssh-action/actions)
**Important**: Only support **Linux** [docker](https://www.docker.com/) container.
This thing is built using [Golang](https://go.dev) and [drone-ssh](https://github.com/appleboy/drone-ssh). 🚀
## Input variables
See [action.yml](./action.yml) for more detailed information.
* `host` - ssh host
* `port` - ssh port, default is `22`
* `username` - ssh username
* `password` - ssh password
* `passphrase` - the passphrase is usually to encrypt the private key
* `sync` - synchronous execution if multiple hosts, default is false
* `timeout` - timeout for ssh to remote host, default is `30s`
* `command_timeout` - timeout for ssh command, default is `10m`
* `key` - content of ssh private key. ex raw content of ~/.ssh/id_rsa, remember include the BEGIN and END lines
* `key_path` - path of ssh private key
* `fingerprint` - fingerprint SHA256 of the host public key, default is to skip verification
* `script` - execute commands
* `script_stop` - stop script after first failure
* `envs` - pass environment variable to shell script
* `debug` - enable debug mode
* `use_insecure_cipher` - include more ciphers with use_insecure_cipher (see [#56](https://github.com/appleboy/ssh-action/issues/56))
* `cipher` - the allowed cipher algorithms. If unspecified then a sensible
* `envs_format` - flexible configuration of environment value transfer. default is `export {NAME}={VALUE}`
SSH Proxy Setting:
* `proxy_host` - proxy host
* `proxy_port` - proxy port, default is `22`
* `proxy_username` - proxy username
* `proxy_password` - proxy password
* `proxy_passphrase` - the passphrase is usually to encrypt the private key
* `proxy_timeout` - timeout for ssh to proxy host, default is `30s`
* `proxy_key` - content of ssh proxy private key.
* `proxy_key_path` - path of ssh proxy private key
* `proxy_fingerprint` - fingerprint SHA256 of the proxy host public key, default is to skip verification
* `proxy_use_insecure_cipher` - include more ciphers with use_insecure_cipher (see [#56](https://github.com/appleboy/ssh-action/issues/56))
* `proxy_cipher` - the allowed cipher algorithms. If unspecified then a sensible
## Usage
Executing remote ssh commands.
```yaml
name: remote ssh command
on: [push]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
@ -28,35 +79,92 @@ output:
whoami
======END======
out: ***
==========================================
Successfully executed commands to all host.
==========================================
==============================================
Successfully executed commands to all host.
==============================================
```
## Input variables
### Setting up a SSH Key
see the [action.yml](./action.yml) file for more detail imformation.
Make sure to follow the below steps while creating SSH Keys and using them.
The best practice is create the SSH Keys on local machine not remote machine.
Login with username specified in Github Secrets. Generate a RSA Key-Pair:
* host - scp remote host
* port - scp remote port
* username - scp username
* password - scp password
* timeout - timeout for ssh to remote host, default is `30s`
* command_timeout - timeout for scp command, default is `1m`
* key - content of ssh private key. ex raw content of ~/.ssh/id_rsa
* key_path - path of ssh private key
* script - execute commands
* script_stop - stop script after first failure
* envs - pass environment variable to shell script
* debug - enable debug mode
### Generate rsa key
```bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
### Generate ed25519 key
```bash
ssh-keygen -t ed25519 -a 200 -C "your_email@example.com"
```
Add newly generated key into Authorized keys. Read more about authorized keys [here](https://www.ssh.com/ssh/authorized_keys/).
### Add rsa key into Authorized keys
```bash
cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
```
### Add ed25519 key into Authorized keys
```bash
cat .ssh/id_ed25519.pub | ssh b@B 'cat >> .ssh/authorized_keys'
```
Copy Private Key content and paste in Github Secrets.
### Copy rsa Private key
```bash
clip < ~/.ssh/id_rsa
```
### Copy ed25519 Private key
```bash
clip < ~/.ssh/id_ed25519
```
See the detail information about [SSH login without password](http://www.linuxproblem.org/art_9.html).
**A note** from one of our readers: Depending on your version of SSH you might also have to do the following changes:
* Put the public key in `.ssh/authorized_keys2`
* Change the permissions of `.ssh` to 700
* Change the permissions of `.ssh/authorized_keys2` to 640
### If you are using OpenSSH
If you are currently using OpenSSH and are getting the following error:
```bash
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]
```
Make sure that your key algorithm of choice is supported. On Ubuntu 20.04 or later you must explicitly allow the use of the ssh-rsa algorithm. Add the following line to your OpenSSH daemon file (which is either `/etc/ssh/sshd_config` or a drop-in file under `/etc/ssh/sshd_config.d/`):
```bash
CASignatureAlgorithms +ssh-rsa
```
Alternatively, `ed25519` keys are accepted by default in OpenSSH. You could use this instead of rsa if needed:
```bash
ssh-keygen -t ed25519 -a 200 -C "your_email@example.com"
```
### Example
Executing remote ssh commands using password.
#### Executing remote ssh commands using password
```yaml
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
@ -65,11 +173,11 @@ Executing remote ssh commands using password.
script: whoami
```
Using private key
#### Using private key
```yaml
- name: executing remote ssh commands using ssh key
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
@ -78,11 +186,11 @@ Using private key
script: whoami
```
Multiple Commands
#### Multiple Commands
```yaml
- name: multiple command
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
@ -95,10 +203,11 @@ Multiple Commands
![result](./images/output-result.png)
Multiple Hosts
#### Multiple Hosts
```diff
uses: appleboy/ssh-action@master
- name: multiple host
uses: appleboy/ssh-action@v0.1.9
with:
- host: "foo.com"
+ host: "foo.com,bar.com"
@ -110,33 +219,184 @@ Multiple Hosts
ls -al
```
Pass environment variable to shell script
#### Multiple hosts with different port
```diff
uses: appleboy/ssh-action@master
- name: multiple host
uses: appleboy/ssh-action@v0.1.9
with:
- host: "foo.com"
+ host: "foo.com:1234,bar.com:5678"
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
script: |
whoami
ls -al
```
#### Synchronous execution on multiple hosts
```diff
- name: multiple host
uses: appleboy/ssh-action@v0.1.9
with:
host: "foo.com,bar.com"
+ sync: true
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
```
#### Pass environment variable to shell script
```diff
- name: pass environment
uses: appleboy/ssh-action@v0.1.9
+ env:
+ FOO: "BAR"
+ BAR: "FOO"
+ SHA: ${{ github.sha }}
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ envs: FOO
+ envs: FOO,BAR,SHA
script: |
echo "I am $FOO"
echo "I am $BAR"
echo "sha: $SHA"
```
Stop script after first failure. ex: missing `abc` folder
_Inside `env` object, you need to pass every environment variable as a string, passing `Integer` data type or any other may output unexpected results._
```yaml
#### Stop script after first failure
> ex: missing `abc` folder
```diff
- name: stop script if command error
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script_stop: true
script: "mkdir abc/def,ls -al"
+ script_stop: true
script: |
mkdir abc/def
ls -al
```
output:
```sh
======CMD======
mkdir abc/def
ls -al
======END======
2019/11/21 01:16:21 Process exited with status 1
err: mkdir: cannot create directory abc/def: No such file or directory
##[error]Docker run failed with exit code 1
```
#### How to connect remote server using `ProxyCommand`?
```bash
+--------+ +----------+ +-----------+
| Laptop | <--> | Jumphost | <--> | FooServer |
+--------+ +----------+ +-----------+
```
in your `~/.ssh/config`, you will see the following.
```bash
Host Jumphost
HostName Jumphost
User ubuntu
Port 22
IdentityFile ~/.ssh/keys/jump_host.pem
Host FooServer
HostName FooServer
User ubuntu
Port 22
ProxyCommand ssh -q -W %h:%p Jumphost
```
#### How to convert to YAML format of GitHubActions
```diff
- name: ssh proxy command
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ proxy_host: ${{ secrets.PROXY_HOST }}
+ proxy_username: ${{ secrets.PROXY_USERNAME }}
+ proxy_key: ${{ secrets.PROXY_KEY }}
+ proxy_port: ${{ secrets.PROXY_PORT }}
script: |
mkdir abc/def
ls -al
```
#### Protecting a Private Key
The purpose of the passphrase is usually to encrypt the private key.
This makes the key file by itself useless to an attacker.
It is not uncommon for files to leak from backups or decommissioned hardware, and hackers commonly exfiltrate files from compromised systems.
```diff
- name: ssh key passphrase
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ passphrase: ${{ secrets.PASSPHRASE }}
script: |
whoami
ls -al
```
#### Using host fingerprint verification
Setting up SSH host fingerprint verification can help to prevent Person-in-the-Middle attacks. Before setting this up, run the command below to get your SSH host fingerprint. Remember to replace `ed25519` with your appropriate key type (`rsa`, `dsa`, etc.) that your server is using and `example.com` with your host.
In modern OpenSSH releases, the _default_ key types to be fetched are `rsa` (since version 5.1), `ecdsa` (since version 6.0), and `ed25519` (since version 6.7).
```sh
ssh example.com ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub | cut -d ' ' -f2
```
Now you can adjust you config:
```diff
- name: ssh key passphrase
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ fingerprint: ${{ secrets.FINGERPRINT }}
script: |
whoami
ls -al
```
## Contributing
We would love for you to contribute to `appleboy/ssh-action`, pull requests are welcome!
## License
The scripts and documentation in this project are released under the [MIT License](LICENSE)

393
README.zh-tw.md Normal file
View File

@ -0,0 +1,393 @@
# 🚀 用於 GitHub Actions 的 SSH
[GitHub Action](https://github.com/features/actions) for executing remote ssh commands.
![ssh workflow](./images/ssh-workflow.png)
[![Actions Status](https://github.com/appleboy/ssh-action/workflows/remote%20ssh%20command/badge.svg)](https://github.com/appleboy/ssh-action/actions)
**注意** 只支援在 **Linux** [docker](https://www.docker.com/) 容器上執行。
## 輸入變數
更詳細的資訊,請參閱 [action.yml](./action.yml)。
* `host` - SSH 主機
* `port` - SSH 連接埠,預設為 `22`
* `username` - SSH 使用者名稱
* `password` - SSH 密碼
* `passphrase` - 通常用於加密私鑰的 passphrase
* `sync` - 同步執行多個主機上的命令,預設為 false
* `timeout` - SSH 連接到遠端主機的超時時間,預設為 `30s`
* `command_timeout` - SSH 命令超時時間,預設為 10m
* `key` - SSH 私鑰的內容,例如 ~/.ssh/id_rsa 的原始內容,請記得包含 BEGIN 和 END 行
* `key_path` - SSH 私鑰的路徑
* `fingerprint` - 主機公鑰的 SHA256 指紋,預設為略過驗證
* `script` - 執行命令
* `script_stop` - 當出現第一個錯誤時停止執行命令
* `envs` - 傳遞環境變數到 shell script
* `debug` - 啟用偵錯模式
* `use_insecure_cipher` - 使用不安全的密碼ciphers進行加密參見 [#56](https://github.com/appleboy/ssh-action/issues/56)
* `cipher` - 允許使用的密碼ciphers演算法。如果未指定則使用適當的演算法
SSH 代理設置:
* `proxy_host` - 代理主機
* `proxy_port` - 代理端口,預設為 `22`
* `proxy_username` - 代理使用者名稱
* `proxy_password` - 代理密碼
* `proxy_passphrase` - 密碼通常用於加密私有金鑰
* `proxy_timeout` - SSH 連線至代理主機的逾時時間,預設為 `30s`
* `proxy_key` - SSH 代理私有金鑰內容
* `proxy_key_path` - SSH 代理私有金鑰路徑
* `proxy_fingerprint` - 代理主機公鑰的 SHA256 指紋,預設為跳過驗證
* `proxy_use_insecure_cipher` - 使用不安全的加密方式,請參閱 [#56](https://github.com/appleboy/ssh-action/issues/56)
* `proxy_cipher` - 允許的加密算法。如果未指定,則使用合理的算法
## 使用方式
執行遠端 SSH 命令
```yaml
name: remote ssh command
on: [push]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: whoami
```
畫面輸出
```sh
======CMD======
whoami
======END======
out: ***
==============================================
✅ Successfully executed commands to all host.
==============================================
```
### 設置 SSH 金鑰
請在創建 SSH 金鑰並使用 SSH 金鑰時遵循以下步驟。最佳做法是在本地機器上創建 SSH 金鑰而不是遠端機器上。請使用 Github Secrets 中指定的用戶名登錄。生成 RSA 金鑰:
### 生成 RSA 金鑰
```bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
### 生成 ed25519 金鑰
```bash
ssh-keygen -t ed25519 -a 200 -C "your_email@example.com"
```
將新生成的金鑰添加到已授權的金鑰中。詳細了解已授權的金鑰請點擊[此處](https://www.ssh.com/ssh/authorized_keys/).
### 將 RSA 金鑰添加到已授權金鑰中
```bash
cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
```
### 將 ed25519 金鑰添加到已授權金鑰中
```bash
cat .ssh/id_ed25519.pub | ssh b@B 'cat >> .ssh/authorized_keys'
```
複製私鑰內容,然後將其粘貼到 Github Secrets 中。
### 複製 rsa 私鑰內容
```bash
clip < ~/.ssh/id_rsa
```
### 複製 ed25519 私鑰內容
```bash
clip < ~/.ssh/id_ed25519
```
有關無需密碼登錄 SSH 的詳細信息,請[參見該網站](http://www.linuxproblem.org/art_9.html)。
**來自讀者的注意事項** 根據您的 SSH 版本,您可能還需要進行以下更改:
* 將公鑰放在 `.ssh/authorized_keys2`
*`.ssh` 的權限更改為700
*`.ssh/authorized_keys2` 的權限更改為640
### 如果你使用的是 OpenSSH
如果您正在使用 OpenSSH並出現以下錯誤
```bash
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]
```
請確保您所選擇的密鑰演算法得到支援。在 Ubuntu 20.04 或更高版本上,您必須明確允許使用 SSH-RSA 演算法。請在 OpenSSH 守護進程文件中添加以下行(它可以是 `/etc/ssh/sshd_config``/etc/ssh/sshd_config.d/` 中的一個附著文件):
```bash
CASignatureAlgorithms +ssh-rsa
```
或者,`Ed25519` 密鑰在 OpenSSH 中默認被接受。如果需要,您可以使用它來替代 RSA。
```bash
ssh-keygen -t ed25519 -a 200 -C "your_email@example.com"
```
### Example
#### 使用密碼執行遠端 SSH 命令
```yaml
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: whoami
```
#### 使用私鑰
```yaml
- name: executing remote ssh commands using ssh key
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: whoami
```
#### 多個命令
```yaml
- name: multiple command
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
```
![result](./images/output-result.png)
#### 多台主機
```diff
- name: multiple host
uses: appleboy/ssh-action@v0.1.9
with:
- host: "foo.com"
+ host: "foo.com,bar.com"
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
```
#### 多個不同端口的主機
```diff
- name: multiple host
uses: appleboy/ssh-action@v0.1.9
with:
- host: "foo.com"
+ host: "foo.com:1234,bar.com:5678"
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
script: |
whoami
ls -al
```
#### 在多個主機上同步執行
```diff
- name: multiple host
uses: appleboy/ssh-action@v0.1.9
with:
host: "foo.com,bar.com"
+ sync: true
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
```
#### 將環境變量傳遞到 Shell 腳本
```diff
- name: pass environment
uses: appleboy/ssh-action@v0.1.9
+ env:
+ FOO: "BAR"
+ BAR: "FOO"
+ SHA: ${{ github.sha }}
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ envs: FOO,BAR,SHA
script: |
echo "I am $FOO"
echo "I am $BAR"
echo "sha: $SHA"
```
_在 `env` 對象中,您需要將每個環境變量作為字符串傳遞,傳遞 `Integer` 數據類型或任何其他類型可能會產生意外結果。_
#### 在第一次失敗後停止腳本
> ex: missing `abc` folder
```diff
- name: stop script if command error
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ script_stop: true
script: |
mkdir abc/def
ls -al
```
畫面輸出:
```sh
======CMD======
mkdir abc/def
ls -al
======END======
2019/11/21 01:16:21 Process exited with status 1
err: mkdir: cannot create directory abc/def: No such file or directory
##[error]Docker run failed with exit code 1
```
#### 如何使用 `ProxyCommand` 連接遠程服務器?
```bash
+--------+ +----------+ +-----------+
| Laptop | <--> | Jumphost | <--> | FooServer |
+--------+ +----------+ +-----------+
```
在您的 `~/.ssh/config` 文件中,您會看到以下內容。
```bash
Host Jumphost
HostName Jumphost
User ubuntu
Port 22
IdentityFile ~/.ssh/keys/jump_host.pem
Host FooServer
HostName FooServer
User ubuntu
Port 22
ProxyCommand ssh -q -W %h:%p Jumphost
```
#### 如何將其轉換為 GitHubActions 的 YAML 格式?
```diff
- name: ssh proxy command
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ proxy_host: ${{ secrets.PROXY_HOST }}
+ proxy_username: ${{ secrets.PROXY_USERNAME }}
+ proxy_key: ${{ secrets.PROXY_KEY }}
+ proxy_port: ${{ secrets.PROXY_PORT }}
script: |
mkdir abc/def
ls -al
```
#### 如何保護私鑰?
密碼短語通常用於加密私鑰。這使得攻擊者無法單獨使用密鑰文件。文件泄露可能來自備份或停用的硬件,黑客通常可以從受攻擊系統中洩露文件。因此,保護私鑰非常重要。
```diff
- name: ssh key passphrase
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ passphrase: ${{ secrets.PASSPHRASE }}
script: |
whoami
ls -al
```
#### 使用主機指紋驗證
設置 SSH 主機指紋驗證可以幫助防止中間人攻擊。在設置之前,運行以下命令以獲取 SSH 主機指紋。請記得將 `ed25519` 替換為您的適當金鑰類型(`rsa``dsa`等),而 `example.com` 則替換為您的主機。
現代 OpenSSH 版本中需要提取的_默認金鑰_類型是 `rsa`(從版本 5.1 開始)、`ecdsa`(從版本 6.0 開始)和 `ed25519`(從版本 6.7 開始)。
```sh
ssh example.com ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub | cut -d ' ' -f2
```
現在您可以調整您的配置:
```diff
- name: ssh key passphrase
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ fingerprint: ${{ secrets.FINGERPRINT }}
script: |
whoami
ls -al
```
## 貢獻
我們非常希望您為 `appleboy/ssh-action` 做出貢獻,歡迎提交請求!
## 授權方式
本項目中的腳本和文檔采用 [MIT](LICENSE) 許可證 發布。

View File

@ -3,23 +3,61 @@ description: 'Executing remote ssh commands'
author: 'Bo-Yi Wu'
inputs:
host:
description: 'ssh remote host'
description: 'ssh host'
port:
description: 'ssh remote port'
description: 'ssh port'
default: 22
passphrase:
description: 'ssh key passphrase'
username:
description: 'ssh username'
password:
description: 'ssh password'
sync:
description: 'synchronous execution if multiple hosts'
default: false
use_insecure_cipher:
description: 'include more ciphers with use_insecure_cipher'
default: false
cipher:
description: 'the allowed cipher algorithms. If unspecified then a sensible'
timeout:
description: 'timeout for ssh to remote host'
description: 'timeout for ssh to host'
default: "30s"
command_timeout:
description: 'timeout for ssh command'
default: "1m"
default: "10m"
key:
description: 'content of ssh private key. ex raw content of ~/.ssh/id_rsa'
key_path:
description: 'path of ssh private key'
fingerprint:
description: 'sha256 fingerprint of the host public key'
proxy_host:
description: 'ssh proxy host'
proxy_port:
description: 'ssh proxy port'
default: 22
proxy_username:
description: 'ssh proxy username'
proxy_password:
description: 'ssh proxy password'
proxy_passphrase:
description: 'ssh proxy key passphrase'
proxy_timeout:
description: 'timeout for ssh to proxy host'
default: "30s"
proxy_key:
description: 'content of ssh proxy private key. ex raw content of ~/.ssh/id_rsa'
proxy_key_path:
description: 'path of ssh proxy private key'
proxy_fingerprint:
description: 'sha256 fingerprint of the proxy host public key'
proxy_cipher:
description: 'the allowed cipher algorithms. If unspecified then a sensible'
proxy_use_insecure_cipher:
description: 'include more ciphers with use_insecure_cipher'
default: false
script:
description: 'execute commands'
script_stop:
@ -27,6 +65,8 @@ inputs:
default: false
envs:
description: 'pass environment variable to shell script'
envs_format:
description: 'flexible configuration of environment value transfer'
debug:
description: 'enable debug mode'
default: false