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を介して特定のタスクをリモートで実行する必要性を解決するためのものです。