Bash

在遠端 SSH 伺服器上執行本地 Shell 腳本,但該腳本需要來自另一個本地文件的環境變數

  • October 18, 2021

我想在遠端機器上執行一個本地 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 之類的東西更可靠地完成整個工作。

引用自:https://unix.stackexchange.com/questions/673638