Bash
在遠端 SSH 伺服器上執行本地 Shell 腳本,但該腳本需要來自另一個本地文件的環境變數
我想在遠端機器上執行一個本地 bash 腳本來安裝和設置 dokku 及其外掛。(
ssh root@remotehost 'bash -s' < dokku.sh
) 該腳本需要一些配置值,例如AWS_BACKUP_ACCESS
等。這些變數儲存在單獨的 json 文件中,如下所示:/home/project/env.json
{ "DB_NAME": "mydb", "APP_NAME": "web", "AWS_BACKUP_ACCESS": "xxx", "AWS_BACKUP_SECRET": "yyy", }
dokku.sh
#!/bin/bash json_file="/home/project/env.json" # export all key values from env.json to globa env for s in $(cat $json_file | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do export $s; done wget https://raw.githubusercontent.com/dokku/dokku/v0.25.7/bootstrap.sh; sudo DOKKU_TAG=v0.25.7 bash bootstrap.sh sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres dokku postgres:create "$DB_NAME" dokku postgres:link "$DB_NAME" "$APP_NAME" # use the Backup IAM profile dokku postgres:backup-auth "$DB_NAME" "$AWS_BACKUP_ACCESS" "$AWS_BACKUP_SECRET" "$AWS_DEFAULT_REGION"
我的問題是如何在遠端伺服器上執行腳本時使以下部分工作,因為文件
/home/project/env.json
儲存在本地:json_file="/home/project/env.json" # export all key values from env.json to globa env for s in $(cat $json_file | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do export $s; done
在本地讀取 JSON 文件,然後進行 SSH 連接。這將不再需要
jq
在遠端系統上可用。你的腳本:
#!/bin/sh set -u -e wget 'https://raw.githubusercontent.com/dokku/dokku/v0.25.7/bootstrap.sh' sudo DOKKU_TAG=v0.25.7 bash bootstrap.sh sudo dokku plugin:install 'https://github.com/dokku/dokku-postgres.git' postgres dokku postgres:create "$DB_NAME" dokku postgres:link "$DB_NAME" "$APP_NAME" # use the Backup IAM profile dokku postgres:backup-auth \ "$DB_NAME" \ "$AWS_BACKUP_ACCESS" \ "$AWS_BACKUP_SECRET" \ "$AWS_DEFAULT_REGION"
執行它:
ssh root@remotehost "env $( jq -r 'to_entries | map("\(.key)=\(.value)") | @sh' /home/project/env.json ) sh -s" <dokku.sh
這將呼叫
env
遠端系統,並使用環境變數列表及其值作為參數。在參數列表的末尾,sh -s
它將讀取您的dokku.sh
腳本並執行它(該腳本不使用 bashism,因此無需呼叫更高級的 shell)。我還在
set -u
腳本中使用它來使其在遇到未設置的變數時set -e
終止,並在任何錯誤時終止。您顯然可以將
ssh
-calling 位包裝在本地腳本中,或者使用 Ansible 之類的東西更可靠地完成整個工作。