48 Commits

Author SHA1 Message Date
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
a2d5832a97 chore: update drone-ssh version
Some checks failed
remote ssh command / Build (push) Failing after 4s
2019-09-29 12:11:00 +08:00
49e81b4a32 docs: add stop script if command error 2019-09-29 12:02:21 +08:00
04535147e0 chore: stop script 2019-09-29 11:49:01 +08:00
533a062133 chore: update docs 2019-09-29 11:45:42 +08:00
ef697c0ac1 docs: add Pass environment variable to shell script 2019-09-29 11:23:40 +08:00
480ff5e05e chore: add FOO envs 2019-09-29 11:19:40 +08:00
ccece0c886 chore: add envs 2019-09-29 11:18:42 +08:00
7e0bb7cd75 chore: add script_stop 2019-09-29 11:17:11 +08:00
dc9ae8e2e3 chore: add some example 2019-09-29 11:16:09 +08:00
d0bd170212 docs: update readme. 2019-09-29 11:09:26 +08:00
54eb169e33 chore: support multiple command 2019-09-29 10:55:53 +08:00
1a6f86cece chore: support multiple command 2019-09-29 10:53:17 +08:00
917a1df2a4 chore: executing remote ssh commands using ssh key 2019-09-29 10:52:20 +08:00
b87ddeff00 fix: ENTRYPOINT in dockerfile 2019-09-29 10:50:09 +08:00
4f7d6491f3 chore: update action image 2019-09-29 10:46:23 +08:00
1f7ce4dfab chore: rename job title. 2019-09-29 10:45:29 +08:00
46adad98f2 chore: try the drone-ssh latest version 2019-09-29 10:44:56 +08:00
215a0580d7 chore: initial github actions 2019-09-29 10:43:33 +08:00
b305709c8d chore: remove github action label 2019-09-29 10:36:34 +08:00
fd26aa3ca7 chore: add github action yaml 2019-09-29 10:34:58 +08:00
7 changed files with 414 additions and 155 deletions

45
.github/main.workflow vendored
View File

@ -1,45 +0,0 @@
workflow "Remote ssh commands" {
on = "push"
resolves = [
"Executing remote ssh commands",
"Support Private Key",
"Multiple Commands",
]
}
action "Executing remote ssh commands" {
uses = "appleboy/ssh-action@master"
secrets = [
"HOST",
"PASSWORD",
]
args = [
"--user", "actions",
"--script", "whoami",
]
}
action "Support Private Key" {
uses = "appleboy/ssh-action@master"
secrets = [
"HOST",
"KEY",
]
args = [
"--user", "actions",
"--script", "'ls -al'",
]
}
action "Multiple Commands" {
uses = "appleboy/ssh-action@master"
secrets = [
"HOST",
"KEY",
]
args = [
"--user", "actions",
"--script", "'whoami'",
"--script", "'ls -al'",
]
}

104
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,104 @@
name: remote ssh command
on: [push]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v1
- name: executing remote ssh commands using password
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: whoami
- name: executing remote ssh commands using ssh key
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: whoami
- name: multiple command
uses: ./
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
# - name: stop script if command error
# uses: ./
# with:
# host: ${{ secrets.HOST }}
# username: ${{ secrets.USERNAME }}
# key: ${{ secrets.KEY }}
# port: ${{ secrets.PORT }}
# script_stop: true
# script: |
# mkdir abc/def
# ls -al
- name: pass environment
uses: ./
env:
FOO: "BAR"
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
envs: FOO
script: |
echo "I am $FOO, thanks"
echo "I am $BAR, thanks"
- name: pass multiple environment
uses: ./
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, thanks"
echo "I am $BAR, thanks"
echo "sha: $SHA"
- 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: whoami
use_insecure_cipher: true

View File

@ -1,15 +1,4 @@
FROM appleboy/drone-ssh:1.5.1-linux-amd64
# Github labels
LABEL "com.github.actions.name"="SSH Commands"
LABEL "com.github.actions.description"="Executing remote ssh commands"
LABEL "com.github.actions.icon"="terminal"
LABEL "com.github.actions.color"="gray-dark"
LABEL "repository"="https://github.com/appleboy/ssh-action"
LABEL "homepage"="https://github.com/appleboy"
LABEL "maintainer"="Bo-Yi Wu <appleboy.tw@gmail.com>"
LABEL "version"="0.0.2"
FROM appleboy/drone-ssh:1.6.0-linux-amd64
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

330
README.md
View File

@ -1,132 +1,266 @@
# 🚀 SSH for GitHub Actions
[GitHub Action](https://developer.github.com/actions/) for executing remote ssh commands.
[GitHub Action](https://github.com/features/actions) for executing remote ssh commands.
<img src="./images/ssh-workflow.png">
![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)
**Importment**: Only support **Linux** container.
## Usage
Executing remote ssh commands.
```
action "Executing remote ssh commands" {
uses = "appleboy/ssh-action@master"
secrets = [
"HOST",
"PASSWORD",
]
args = [
"--user", "actions",
"--script", "whoami",
]
}
```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
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: whoami
```
## Environment variables
output:
* HOST - ssh server host
* PORT - ssh server port
* USERNAME - ssh server username
* PASSWORD - ssh server password
* KEY - ssh server private key
* SCRIPT - execute the scripts
```sh
======CMD======
whoami
======END======
out: ***
==============================================
✅ Successfully executed commands to all host.
==============================================
```
## 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
* 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
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
### Example
Executing remote ssh commands.
Executing remote ssh commands using password.
```
action "Executing remote ssh commands" {
uses = "appleboy/ssh-action@master"
secrets = [
"PASSWORD",
]
args = [
"--host", "foo.com"
"--user", "bar",
"--script", "whoami",
]
}
```yaml
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
port: ${{ secrets.PORT }}
script: whoami
```
Using private key
```
action "Support Private Key" {
uses = "appleboy/ssh-action@master"
secrets = [
"HOST",
"KEY",
]
args = [
"--user", "actions",
"--script", "'ls -al'",
]
}
```yaml
- name: executing remote ssh commands using ssh key
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: whoami
```
Multiple Commands
```
action "Multiple Commands" {
uses = "appleboy/ssh-action@master"
secrets = [
"HOST",
"KEY",
]
args = [
"--user", "actions",
"--script", "'whoami'",
"--script", "'ls -al'",
]
}
```yaml
- name: multiple command
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
```
<img src="./images/multiple-command-result.png">
![result](./images/output-result.png)
Multiple Hosts
```
action "Multiple Hosts" {
uses = "appleboy/ssh-action@master"
secrets = [
"KEY",
]
args = [
"--host", "foo.com",
"--host", "bar.com",
"--user", "actions",
"--script", "'whoami'",
"--script", "'ls -al'",
"--script", "'cat test.txt'",
]
}
```diff
- name: multiple host
uses: appleboy/ssh-action@master
with:
- host: "foo.com"
+ host: "foo.com,bar.com"
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
```
see the detail of `drone-ssh` command
Synchronous execution on multiple hosts
```
--ssh-key value private ssh key [$PLUGIN_SSH_KEY, $PLUGIN_KEY, $SSH_KEY, $KEY]
--key-path value, -i value ssh private key path [$PLUGIN_KEY_PATH, $SSH_KEY_PATH, $PATH]
--username value, --user value, -u value connect as user (default: "root") [$PLUGIN_USERNAME, $PLUGIN_USER, $SSH_USERNAME, $USERNAME]
--password value, -P value user password [$PLUGIN_PASSWORD, $SSH_PASSWORD, $PASSWORD]
--host value, -H value connect to host [$PLUGIN_HOST, $SSH_HOST, $HOST]
--port value, -p value connect to port (default: 22) [$PLUGIN_PORT, $SSH_PORT, $PORT]
--sync sync mode [$PLUGIN_SYNC, $SYNC]
--timeout value, -t value connection timeout (default: 0s) [$PLUGIN_TIMEOUT, $SSH_TIMEOUT, $TIMEOUT]
--command.timeout value, -T value command timeout (default: 1m0s) [$PLUGIN_COMMAND_TIMEOUT, $SSH_COMMAND_TIMEOUT, $COMMAND_TIMEOUT]
--script value, -s value execute commands [$PLUGIN_SCRIPT, $SSH_SCRIPT, $SCRIPT]
--script.stop stop script after first failure [$PLUGIN_SCRIPT_STOP, $STOP]
--proxy.ssh-key value private ssh key of proxy [$PLUGIN_PROXY_SSH_KEY, $PLUGIN_PROXY_KEY, $PROXY_SSH_KEY]
--proxy.key-path value ssh private key path of proxy [$PLUGIN_PROXY_KEY_PATH, $PROXY_SSH_KEY_PATH]
--proxy.username value connect as user of proxy (default: "root") [$PLUGIN_PROXY_USERNAME, $PLUGIN_PROXY_USER, $PROXY_SSH_USERNAME]
--proxy.password value user password of proxy [$PLUGIN_PROXY_PASSWORD, $PROXY_SSH_PASSWORD]
--proxy.host value connect to host of proxy [$PLUGIN_PROXY_HOST, $PROXY_SSH_HOST]
--proxy.port value connect to port of proxy (default: "22") [$PLUGIN_PROXY_PORT, $PROXY_SSH_PORT]
--proxy.timeout value proxy connection timeout (default: 0s) [$PLUGIN_PROXY_TIMEOUT, $PROXY_SSH_TIMEOUT]
```diff
- name: multiple host
uses: appleboy/ssh-action@master
with:
host: "foo.com,bar.com"
+ sync: true
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
whoami
ls -al
```
## Secrets
Pass environment variable to shell script
* `PASSWORD` - ssh server password
* `KEY` - ssh server private key
```diff
- name: pass environment
uses: appleboy/ssh-action@master
+ env:
+ FOO: "BAR"
+ BAR: "FOO"
+ SHA: ${{ github.sha }}
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ envs: FOO,BAR
script: |
echo "I am $FOO"
echo "I am $BAR"
echo "sha: $SHA"
```
Stop script after first failure. ex: missing `abc` folder
```diff
- name: stop script if command error
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ 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@master
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@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
+ passphrase: ${{ secrets.PASSPHRASE }}
script: |
whoami
ls -al
```

77
action.yml Normal file
View File

@ -0,0 +1,77 @@
name: 'SSH Remote Commands'
description: 'Executing remote ssh commands'
author: 'Bo-Yi Wu'
inputs:
host:
description: 'ssh host'
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 host'
default: "30s"
command_timeout:
description: 'timeout for ssh command'
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:
description: 'stop script after first failure'
default: false
envs:
description: 'pass environment variable to shell script'
debug:
description: 'enable debug mode'
default: false
runs:
using: 'docker'
image: 'Dockerfile'
branding:
icon: 'terminal'
color: 'gray-dark'

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

BIN
images/output-result.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB