SSHを介して変数を含むローカルスクリプトファイルを実行することはできません。

SSHを介して変数を含むローカルスクリプトファイルを実行することはできません。

リモートシステムで実行するには、次のスクリプト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段階的に見てみると、次のようになります。

  1. このコマンドはsshを介して接続し、ローカルで行を送信します。test.sh

    ssh -i "auth.key" user@host 'bash -s' < test.sh
    
  2. 接続を介してリモート シェルを起動し、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'

関連情報