リモートSSH出力が「echo $ SHELL」をキャプチャしないのはなぜですか?

リモートSSH出力が「echo $ SHELL」をキャプチャしないのはなぜですか?

bash でも Python でも cat を使ってリモート SSH 呼び出しの出力をキャプチャすると、すべてが期待どおりに動作します。

たとえば、次はうまくいきます。

import subprocess
rc = subprocess.getoutput(“ssh user@host; cat /proc/meminfo”)
print(rc)
>> MemTotal:        2048212 kB
MemFree:          202168 kB
MemAvailable:    1578308 kB
Buffers:          240876 kB
Cached:          1073456 kB
SwapCached:            0 kB
Active:          1049444 kB
…etc

ただし、結果は生成されません。

import subprocess 
rc = subprocess.getoutput(“ssh user@host; echo $SHELL”)
>>

同じユーザーでSSHを介してシステムに接続し、「echo $ SHELL」と入力しても動作し、stdoutとして出力されます。

私がここで何を見逃しているのでしょうか?

私のメモには次のようなコメントがあります。

シェルスクリプトでローカル環境変数を使用できるようにするには、execコマンドを使用してスクリプトを起動します。

コマンドプロンプトから直接スクリプトを実行すると、スクリプトの新しいサブシェルが作成され、シェル内のすべてのローカル環境変数がスクリプトで使用できなくなります。

リモートコマンドの実行でこれらの環境変数を使用するには、「exec」を使用する必要がありますか?

これは、Pythonの問題やRHEL8の問題ではなく、Ununtuを含む他のLinuxバリアントでも再現できます。

ありがとうございます。

答え1

どちらの場合もSSH接続終了次に、2番目のコマンドを実行します。ローカルマシンで。たとえば、/proc/meminfo出力は次のようになります。地元の何らかの方法で遠隔操作せずに機械で動作します。

リモートで実行するには、次を使用します。

ssh user@host cat /proc/meminfo-気づく部族sshクライアントの "cat"および "/proc/meminfo"パラメータを生成するセミコロンは、クライアントが構築されリモートで実行されるコマンドラインです。

2番目のケースはよりトリッキーです。セミコロンを使用するとローカルで実行されるだけでなく、交換注文しかも5セント。素朴なバリアントでは、変数をローカルに置き換えてから、置き換えられたコマンドをリモート実行に送信します。必要に応じて正しく機能するには、次のものが必要です。止めるローカル置換、一重引用符を使用する:

ssh user@host echo '$SHELL'

(何を意味するのか比較してください。ssh user@host echo `hostname -f`ssh user@host echo '`hostname -f`'


学ぶ準備ができているようです。アンシプールこれは、自動化された方法でSSHを介して特定のタスクをリモートで実行する必要性を解決するためのものです。

関連情報