Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
73767290ca | |||
e5c07fceef | |||
d690bdebf8 | |||
f478af9b34 | |||
d520c19f4f | |||
0dee98b334 | |||
9085f3ea5b | |||
696aab4627 | |||
a88f6f2013 | |||
6f091cd9e3 | |||
aa1ecdd19a | |||
bffdd4e1f4 | |||
f4890bec77 | |||
9aaf218321 |
35
.github/workflows/ci.yml
vendored
35
.github/workflows/ci.yml
vendored
@ -43,7 +43,9 @@ jobs:
|
|||||||
# key: ${{ secrets.KEY }}
|
# key: ${{ secrets.KEY }}
|
||||||
# port: ${{ secrets.PORT }}
|
# port: ${{ secrets.PORT }}
|
||||||
# script_stop: true
|
# script_stop: true
|
||||||
# script: "mkdir abc/def,ls -al"
|
# script: |
|
||||||
|
# mkdir abc/def
|
||||||
|
# ls -al
|
||||||
|
|
||||||
- name: pass environment
|
- name: pass environment
|
||||||
uses: appleboy/ssh-action@master
|
uses: appleboy/ssh-action@master
|
||||||
@ -56,5 +58,32 @@ jobs:
|
|||||||
port: ${{ secrets.PORT }}
|
port: ${{ secrets.PORT }}
|
||||||
envs: FOO
|
envs: FOO
|
||||||
script: |
|
script: |
|
||||||
echo "I am $FOO"
|
echo "I am $FOO, thanks"
|
||||||
echo "I am $BAR"
|
echo "I am $BAR, thanks"
|
||||||
|
|
||||||
|
- name: pass multiple environment
|
||||||
|
uses: appleboy/ssh-action@master
|
||||||
|
env:
|
||||||
|
FOO: "BAR"
|
||||||
|
BAR: "FOO"
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: ${{ secrets.KEY }}
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
envs: FOO,BAR
|
||||||
|
script: |
|
||||||
|
echo "I am $FOO, thanks"
|
||||||
|
echo "I am $BAR, thanks"
|
||||||
|
|
||||||
|
- name: ssh key passphrase
|
||||||
|
uses: appleboy/ssh-action@master
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: ${{ secrets.SSH2 }}
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
passphrase: ${{ secrets.PASSPHRASE }}
|
||||||
|
script: |
|
||||||
|
whoami
|
||||||
|
ls -al
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM appleboy/drone-ssh:1.5.2-linux-amd64
|
FROM appleboy/drone-ssh:1.5.5-linux-amd64
|
||||||
|
|
||||||
ADD entrypoint.sh /entrypoint.sh
|
ADD entrypoint.sh /entrypoint.sh
|
||||||
RUN chmod +x /entrypoint.sh
|
RUN chmod +x /entrypoint.sh
|
||||||
|
197
README.md
197
README.md
@ -1,6 +1,6 @@
|
|||||||
# 🚀 SSH for GitHub Actions
|
# 🚀 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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -11,14 +11,22 @@
|
|||||||
Executing remote ssh commands.
|
Executing remote ssh commands.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: executing remote ssh commands using password
|
name: remote ssh command
|
||||||
uses: appleboy/ssh-action@master
|
on: [push]
|
||||||
with:
|
jobs:
|
||||||
host: ${{ secrets.HOST }}
|
|
||||||
username: ${{ secrets.USERNAME }}
|
build:
|
||||||
password: ${{ secrets.PASSWORD }}
|
name: Build
|
||||||
port: ${{ secrets.PORT }}
|
runs-on: ubuntu-latest
|
||||||
script: whoami
|
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
|
||||||
```
|
```
|
||||||
|
|
||||||
output:
|
output:
|
||||||
@ -28,21 +36,22 @@ output:
|
|||||||
whoami
|
whoami
|
||||||
======END======
|
======END======
|
||||||
out: ***
|
out: ***
|
||||||
==========================================
|
==============================================
|
||||||
Successfully executed commands to all host.
|
✅ Successfully executed commands to all host.
|
||||||
==========================================
|
==============================================
|
||||||
```
|
```
|
||||||
|
|
||||||
## Input variables
|
## Input variables
|
||||||
|
|
||||||
see the [action.yml](./action.yml) file for more detail imformation.
|
See [action.yml](./action.yml) for more detailed information.
|
||||||
|
|
||||||
* host - scp remote host
|
* host - remote host
|
||||||
* port - scp remote port
|
* port - remote port, default is `22`
|
||||||
* username - scp username
|
* username - ssh username
|
||||||
* password - scp password
|
* password - ssh password
|
||||||
|
* passphrase - the passphrase is usually to encrypt the private key
|
||||||
* timeout - timeout for ssh to remote host, default is `30s`
|
* timeout - timeout for ssh to remote host, default is `30s`
|
||||||
* command_timeout - timeout for scp command, default is `1m`
|
* command_timeout - timeout for ssh command, default is `10m`
|
||||||
* key - content of ssh private key. ex raw content of ~/.ssh/id_rsa
|
* key - content of ssh private key. ex raw content of ~/.ssh/id_rsa
|
||||||
* key_path - path of ssh private key
|
* key_path - path of ssh private key
|
||||||
* script - execute commands
|
* script - execute commands
|
||||||
@ -50,6 +59,17 @@ see the [action.yml](./action.yml) file for more detail imformation.
|
|||||||
* envs - pass environment variable to shell script
|
* envs - pass environment variable to shell script
|
||||||
* debug - enable debug mode
|
* debug - enable debug mode
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
### Example
|
### Example
|
||||||
|
|
||||||
Executing remote ssh commands using password.
|
Executing remote ssh commands using password.
|
||||||
@ -98,45 +118,122 @@ Multiple Commands
|
|||||||
Multiple Hosts
|
Multiple Hosts
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
uses: appleboy/ssh-action@master
|
- name: multiple host
|
||||||
with:
|
uses: appleboy/ssh-action@master
|
||||||
- host: "foo.com"
|
with:
|
||||||
+ host: "foo.com,bar.com"
|
- host: "foo.com"
|
||||||
username: ${{ secrets.USERNAME }}
|
+ host: "foo.com,bar.com"
|
||||||
key: ${{ secrets.KEY }}
|
username: ${{ secrets.USERNAME }}
|
||||||
port: ${{ secrets.PORT }}
|
key: ${{ secrets.KEY }}
|
||||||
script: |
|
port: ${{ secrets.PORT }}
|
||||||
whoami
|
script: |
|
||||||
ls -al
|
whoami
|
||||||
|
ls -al
|
||||||
```
|
```
|
||||||
|
|
||||||
Pass environment variable to shell script
|
Pass environment variable to shell script
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
uses: appleboy/ssh-action@master
|
- name: pass environment
|
||||||
+ env:
|
uses: appleboy/ssh-action@master
|
||||||
+ FOO: "BAR"
|
+ env:
|
||||||
with:
|
+ FOO: "BAR"
|
||||||
host: ${{ secrets.HOST }}
|
+ BAR: "FOO"
|
||||||
username: ${{ secrets.USERNAME }}
|
with:
|
||||||
key: ${{ secrets.KEY }}
|
host: ${{ secrets.HOST }}
|
||||||
port: ${{ secrets.PORT }}
|
username: ${{ secrets.USERNAME }}
|
||||||
+ envs: FOO
|
key: ${{ secrets.KEY }}
|
||||||
script: |
|
port: ${{ secrets.PORT }}
|
||||||
echo "I am $FOO"
|
+ envs: FOO,BAR
|
||||||
echo "I am $BAR"
|
script: |
|
||||||
|
echo "I am $FOO"
|
||||||
|
echo "I am $BAR"
|
||||||
```
|
```
|
||||||
|
|
||||||
Stop script after first failure. ex: missing `abc` folder
|
Stop script after first failure. ex: missing `abc` folder
|
||||||
|
|
||||||
```yaml
|
```diff
|
||||||
- name: stop script if command error
|
- name: stop script if command error
|
||||||
uses: appleboy/ssh-action@master
|
uses: appleboy/ssh-action@master
|
||||||
with:
|
with:
|
||||||
host: ${{ secrets.HOST }}
|
host: ${{ secrets.HOST }}
|
||||||
username: ${{ secrets.USERNAME }}
|
username: ${{ secrets.USERNAME }}
|
||||||
key: ${{ secrets.KEY }}
|
key: ${{ secrets.KEY }}
|
||||||
port: ${{ secrets.PORT }}
|
port: ${{ secrets.PORT }}
|
||||||
script_stop: true
|
+ script_stop: true
|
||||||
script: "mkdir abc/def,ls -al"
|
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
|
||||||
```
|
```
|
||||||
|
23
action.yml
23
action.yml
@ -6,6 +6,9 @@ inputs:
|
|||||||
description: 'ssh remote host'
|
description: 'ssh remote host'
|
||||||
port:
|
port:
|
||||||
description: 'ssh remote port'
|
description: 'ssh remote port'
|
||||||
|
default: 22
|
||||||
|
passphrase:
|
||||||
|
description: 'ssh key passphrase'
|
||||||
username:
|
username:
|
||||||
description: 'ssh username'
|
description: 'ssh username'
|
||||||
password:
|
password:
|
||||||
@ -15,11 +18,29 @@ inputs:
|
|||||||
default: "30s"
|
default: "30s"
|
||||||
command_timeout:
|
command_timeout:
|
||||||
description: 'timeout for ssh command'
|
description: 'timeout for ssh command'
|
||||||
default: "1m"
|
default: "10m"
|
||||||
key:
|
key:
|
||||||
description: 'content of ssh private key. ex raw content of ~/.ssh/id_rsa'
|
description: 'content of ssh private key. ex raw content of ~/.ssh/id_rsa'
|
||||||
key_path:
|
key_path:
|
||||||
description: 'path of ssh private key'
|
description: 'path of ssh private key'
|
||||||
|
proxy_host:
|
||||||
|
description: 'ssh proxy remote host'
|
||||||
|
proxy_port:
|
||||||
|
description: 'ssh proxy remote 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'
|
||||||
script:
|
script:
|
||||||
description: 'execute commands'
|
description: 'execute commands'
|
||||||
script_stop:
|
script_stop:
|
||||||
|
Reference in New Issue
Block a user