Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
73767290ca | |||
e5c07fceef | |||
d690bdebf8 | |||
f478af9b34 | |||
d520c19f4f | |||
0dee98b334 |
27
.github/workflows/ci.yml
vendored
27
.github/workflows/ci.yml
vendored
@ -60,3 +60,30 @@ jobs:
|
|||||||
script: |
|
script: |
|
||||||
echo "I am $FOO, thanks"
|
echo "I am $FOO, thanks"
|
||||||
echo "I am $BAR, thanks"
|
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.4-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
|
||||||
|
74
README.md
74
README.md
@ -49,6 +49,7 @@ See [action.yml](./action.yml) for more detailed information.
|
|||||||
* port - remote port, default is `22`
|
* port - remote port, default is `22`
|
||||||
* username - ssh username
|
* username - ssh username
|
||||||
* password - ssh 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 ssh command, default is `10m`
|
* 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
|
||||||
@ -58,6 +59,17 @@ See [action.yml](./action.yml) for more detailed information.
|
|||||||
* 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.
|
||||||
@ -126,12 +138,13 @@ Pass environment variable to shell script
|
|||||||
uses: appleboy/ssh-action@master
|
uses: appleboy/ssh-action@master
|
||||||
+ env:
|
+ env:
|
||||||
+ FOO: "BAR"
|
+ FOO: "BAR"
|
||||||
|
+ BAR: "FOO"
|
||||||
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 }}
|
||||||
+ envs: FOO
|
+ envs: FOO,BAR
|
||||||
script: |
|
script: |
|
||||||
echo "I am $FOO"
|
echo "I am $FOO"
|
||||||
echo "I am $BAR"
|
echo "I am $BAR"
|
||||||
@ -165,3 +178,62 @@ ls -al
|
|||||||
err: mkdir: cannot create directory ‘abc/def’: No such file or directory
|
err: mkdir: cannot create directory ‘abc/def’: No such file or directory
|
||||||
##[error]Docker run failed with exit code 1
|
##[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
|
||||||
|
```
|
||||||
|
20
action.yml
20
action.yml
@ -7,6 +7,8 @@ inputs:
|
|||||||
port:
|
port:
|
||||||
description: 'ssh remote port'
|
description: 'ssh remote port'
|
||||||
default: 22
|
default: 22
|
||||||
|
passphrase:
|
||||||
|
description: 'ssh key passphrase'
|
||||||
username:
|
username:
|
||||||
description: 'ssh username'
|
description: 'ssh username'
|
||||||
password:
|
password:
|
||||||
@ -21,6 +23,24 @@ inputs:
|
|||||||
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