
次のスクリプトがあります。
ssh ip@host /bin/bash << EOF
hostname # Print the remote hostname
A=`hostname`
echo \${A} # Print the local hostname
EOF
リモートサーバーから値を取得し、スクリプト内の変数として使用したいと思います(この場合はhostname
実際には別のものが必要です)。
変数に値を割り当てるときは、常にリモート値ではなくローカル値を取得してください。何が問題なのでしょうか?アドバイスしてください。
答え1
コマンドの置き換え
`hostname`
コマンドは、リモートサーバーに渡される前に、ここの(引用されていない)文書で評価されます。リモートサーバーで評価するには、変数の置換を避けるのと同じ方法でエスケープする必要があります。\${A}
ssh ip@host /bin/bash << EOF
hostname
A=\`hostname\`
echo \${A}
EOF
または(より良い方法は、廃止された逆引用符形式のコマンドの置き換えを置き換えることです)
ssh ip@host /bin/bash << EOF
hostname
A=\$(hostname)
echo \${A}
EOF
または(好ましくは - あなたが望んでいないようだからどの基本拡張)、heredoc自体を引用します。
ssh ip@host /bin/bash << 'EOF'
hostname
A=$(hostname)
echo ${A}
EOF
答え2
あなたはこれを探しています。
hn=$(ssh ユーザー名@domain "ホスト名");echo "ホスト名: $hn"
ホスト名は次のとおりです。[リモート名]
引用符で実行するコマンドは、リモートサーバーからコマンドを実行します。ローカルシステムでコマンドを実行するだけです。これがあなたが望むことだとsshに言わなければなりません。
それ以外の場合は、より複雑なコマンドを表示するには、次を参照してください。 https://stackoverflow.com/questions/305035/how-to-use-ssh-to-run-a-local-shell-script-on-a-remote-machine
マシンAがUnixベースのシステムの場合は、次のものを使用できます。
ssh root@MachineB 'bash -s' < local_script.sh
一般に、コマンドラインにコンテンツをプッシュするのは良い考えではありません。通常、ロジックが含まれており、出力をより簡単に制御できるローカルスクリプトを実行したいと思います。
bashの-sに注意してください。
また、対応するコメント(ここでは繰り返さない)、追加の修飾子、コマンドにルート/sudoが必要かどうかなどを記録してください。
ここで質問するとき、質問についてより多くの情報を提供するほど、あなたが実際に達成しようとしているものを推測する必要がある人が少なくなります。あなたが言葉で明確に言わない場合は、あなたが何をしたいのか誰も知らないことを覚えておいてください。