From 3d8365bb3a1bec8de7d6d4ea3ed9c04770fb92ab Mon Sep 17 00:00:00 2001 From: shimataro Date: Sun, 29 Sep 2019 13:18:35 +0900 Subject: [PATCH] Feature/known_hosts (#25) * * add "known-hosts" option * * update CHANGELOG * * update README * * update actions.yml * * update example of known-hosts * * fix message --- CHANGELOG.md | 4 ++++ README.md | 3 ++- action.yml | 5 +++++ lib/main.js | 38 +++++++++++++++++++++++++++----------- lib/main.js.map | 2 +- src/main.ts | 48 ++++++++++++++++++++++++++++++++++++------------ 6 files changed, 75 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3e9527..b184b9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Added + +* `known-hosts` option + ## [1.2.0] ### Fixed diff --git a/README.md b/README.md index 1d563d9..9de787e 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,11 @@ steps: private-key: ${{ secrets.SSH_KEY }} public-key: ${{ secrets.SSH_KEY_PUBLIC }} name: id_rsa # optional + known-hosts: ${{ secrets.KNOWN_HOSTS }} # optional - name: Install packages run: apt install openssh-client rsync - name: rsync over ssh - run: rsync -e "ssh -o StrictHostKeyChecking=no" ./foo/ user@remote:bar/ + run: rsync ./foo/ user@remote:bar/ ``` See [Workflow syntax for GitHub Actions](https://help.github.com/en/articles/workflow-syntax-for-github-actions) for details. diff --git a/action.yml b/action.yml index 9b5cd2a..e4511aa 100644 --- a/action.yml +++ b/action.yml @@ -13,7 +13,12 @@ inputs: required: true name: description: "SSH key file name (default: id_rsa)" + required: false default: "id_rsa" + known-hosts: + description: "public keys of SSH servers" + required: false + default: "" runs: using: "node12" main: "lib/main.js" diff --git a/lib/main.js b/lib/main.js index b161818..3a88c7a 100644 --- a/lib/main.js +++ b/lib/main.js @@ -15,23 +15,39 @@ const core = __importStar(require("@actions/core")); */ function main() { try { + const name = core.getInput("name"); + const files = [ + { + name: name, + mode: 0o400, + contents: core.getInput("private-key"), + }, + { + name: `${name}.pub`, + mode: 0o444, + contents: core.getInput("public-key"), + }, + { + name: "known_hosts", + mode: 0o644, + contents: core.getInput("known-hosts"), + }, + ]; + // create ".ssh" directory const home = getHomeDirectory(); const dirName = path.resolve(home, ".ssh"); fs.mkdirSync(dirName, { recursive: true, mode: 0o700, }); - const privateKey = core.getInput("private-key"); - const publicKey = core.getInput("public-key"); - const name = core.getInput("name"); - const fileName = path.join(dirName, name); - fs.writeFileSync(fileName, privateKey, { - mode: 0o400, - }); - fs.writeFileSync(`${fileName}.pub`, publicKey, { - mode: 0o444, - }); - console.log(`SSH key has been stored to ${fileName} successfully.`); + // create files + for (const file of files) { + const fileName = path.join(dirName, file.name); + fs.writeFileSync(fileName, file.contents, { + mode: file.mode, + }); + } + console.log(`SSH key has been stored to ${dirName} successfully.`); } catch (err) { core.setFailed(err.message); diff --git a/lib/main.js.map b/lib/main.js.map index 03808b9..9705ee1 100644 --- a/lib/main.js.map +++ b/lib/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAE7B,oDAAsC;AAEtC;;GAEG;AACH,SAAS,IAAI;IAEZ,IACA;QACC,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE;YACrB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,KAAK;SACX,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAW,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAW,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAW,CAAC;QAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE;YACtC,IAAI,EAAE,KAAK;SACX,CAAC,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,GAAG,QAAQ,MAAM,EAAE,SAAS,EAAE;YAC9C,IAAI,EAAE,KAAK;SACX,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,8BAA8B,QAAQ,gBAAgB,CAAC,CAAC;KACpE;IACD,OAAM,GAAG,EACT;QACC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KAC5B;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IAExB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAG,IAAI,KAAK,SAAS,EACrB;QACC,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,iBAAiB,CAAC,CAAC;KAC7C;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAE7B,oDAAsC;AAStC;;GAEG;AACH,SAAS,IAAI;IAEZ,IACA;QACC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAW,CAAC;QAC7C,MAAM,KAAK,GAAe;YACzB;gBACC,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,KAAK;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;aACtC;YACD;gBACC,IAAI,EAAE,GAAG,IAAI,MAAM;gBACnB,IAAI,EAAE,KAAK;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;aACrC;YACD;gBACC,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,KAAK;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;aACtC;SACD,CAAC;QAEF,0BAA0B;QAC1B,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE;YACrB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,KAAK;SACX,CAAC,CAAC;QAEH,eAAe;QACf,KAAI,MAAM,IAAI,IAAI,KAAK,EACvB;YACC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACzC,IAAI,EAAE,IAAI,CAAC,IAAI;aACf,CAAC,CAAC;SACH;QAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,gBAAgB,CAAC,CAAC;KACnE;IACD,OAAM,GAAG,EACT;QACC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KAC5B;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IAExB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAG,IAAI,KAAK,SAAS,EACrB;QACC,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,iBAAiB,CAAC,CAAC;KAC7C;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 3500b2b..0bf3203 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,13 @@ import * as path from "path"; import * as core from "@actions/core"; +interface FileInfo +{ + name: string; + mode: number; + contents: string; +} + /** * main function */ @@ -10,6 +17,26 @@ function main(): void { try { + const name = core.getInput("name") as string; + const files: FileInfo[] = [ + { + name: name, + mode: 0o400, + contents: core.getInput("private-key"), + }, + { + name: `${name}.pub`, + mode: 0o444, + contents: core.getInput("public-key"), + }, + { + name: "known_hosts", + mode: 0o644, + contents: core.getInput("known-hosts"), + }, + ]; + + // create ".ssh" directory const home = getHomeDirectory(); const dirName = path.resolve(home, ".ssh"); fs.mkdirSync(dirName, { @@ -17,19 +44,16 @@ function main(): void mode: 0o700, }); - const privateKey = core.getInput("private-key") as string; - const publicKey = core.getInput("public-key") as string; - const name = core.getInput("name") as string; + // create files + for(const file of files) + { + const fileName = path.join(dirName, file.name); + fs.writeFileSync(fileName, file.contents, { + mode: file.mode, + }); + } - const fileName = path.join(dirName, name); - fs.writeFileSync(fileName, privateKey, { - mode: 0o400, - }); - fs.writeFileSync(`${fileName}.pub`, publicKey, { - mode: 0o444, - }); - - console.log(`SSH key has been stored to ${fileName} successfully.`); + console.log(`SSH key has been stored to ${dirName} successfully.`); } catch(err) {