リモートシステムで実行するには、次のスクリプトtest.shファイルを実行する必要があります。
変数.txt:
name=stackexchange
テスト.sh:
#!/bin/bash
source ./variables.txt
echo $name
走る:
ssh -i "auth.key" user@host 'bash -s' < test.sh
ただし、次のエラーが発生します。
bash: line 2: ./variables.txt: No such file or directory
答え1
そのシェル./variables
に存在しないファイルをインポートするように他のシステムのシェルに指示します。pwd
段階的に見てみると、次のようになります。
このコマンドはsshを介して接続し、ローカルで行を送信します。
test.sh
ssh -i "auth.key" user@host 'bash -s' < test.sh
接続を介してリモート シェルを起動し、
ssh
次の行を取得します。#!/bin/bash
この行に対するリモートシェルの解釈は、シェルが何であるかによって異なります。ほとんどのシェルはこの行をコメントとして扱います。シェルがある場合、sh
リモートシェルはできません。bash
なぜなら、shebang 行はスクリプトファイル内でのみ有効であり、スクリプトは実行可能なビットセットを必要とするからです。source ./variables.txt
これで、リモートシェルはvariables.txt
現在の作業ディレクトリのファイルからデータをインポートするように指示されます。ファイルが存在しない場合、シェルでエラーが発生します。あなたの場合、シェルはBashで、エラーは次のようになります。bash: line 2: ./variables.txt: No such file or directory
echo $name
空のため、$name
端末には空行のみが印刷されます。
variables.txt
これを直接確認するには、ソースとは異なる行を使用してリモートホームディレクトリにファイルを配置します。例:
name=remotehost
以前のようにテストスクリプトを実行します。
答え2
リモートコンピュータで実行されているプログラムは、実行中のコンピュータではなくリモートコンピュータのファイルを表示しますssh
。 SSHにコンテンツをtest.sh
リモートシステムにコピーし、bash
そこに入力として渡すように指示すると実行されますtest.sh
。ただし、スクリプト(bashがstdinから受け取った)が読み取ろうとすると、variables.txt
実行中のシステムはその内容を見つけます。オプションがあるというわけではありませんが)見つかりませんでした。
スクリプトが複雑すぎず、入れ子になった埋め込みがない場合は、テキスト置換を実行してスクリプトの内容をインライン化できます。これは脆弱であることに注意してください。複雑な参照、変数などが関連しているsource ./variables.txt
のではなく、スクリプトに直接表示される場合にのみ機能します。簡単にするために、そのコマンドがその行に単独で存在すると仮定eval
します。source
より複雑なシナリオを処理するには、より複雑な変換が可能です。
<test.sh sed '/^[ \t]*source variables\.txt[ \t]*$/ {
d
r variables.txt
}' | ssh -i "auth.key" user@host 'bash -s'