2017-12-18 10 views
1

私はそうのようにbashにコマンドを送信アプリを持っている:ネストされたbashコマンドの引用の問題

/bin/bash -c "<command goes here>" 

これは素晴らしい作品が、私はもう少し複雑なコマンドを使用して、問題を直撃しています。このコマンドは、SSHサーバーからタールを取得し、pvの進行状況バーを表示して、それをローカルユーザーのディレクトリに保存します。コマンドラインでこのコマンドを実行

su -c "ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar" localuser 

手動で素晴らしい作品が、私は私の人生のために/bin/bash/への引数としてこれを渡す方法を動作することはできません。

私が試してみました:別の構文を使用して

/bin/bash -c "su -c "ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar" localuser" 

そして様々な組み合わせを、私はちょうどそれが働いていない理由を私は本当に理解していないと推測しています。

私はシンプルな例にそれを分解して内部コマンドは、ホームパスを取得します。この単純な例のように単一引用符を使用している場合、それは動作します実現しています

bash -c "su -c 'cd ~ && pwd' localuser" 

が、大きなコマンドでそれが失敗していることを試みます:

/bin/bash -c "su -c 'ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar' localuser" 

それはno passwd entry for user /homeはそうコマンドは、私は推測するまで壊れつつあると言うが、この問題を解決する方法がわからない、ネストされた単一引用符が、イムを買います。

私は単一引用符外に二重引用符入れてみました:

/bin/bash -c "su -c 'ssh -p 1234 [email protected] "'cd /home/ && tar -cf - remoteuser/'" | pv > /home/staging/localuser/staging.tar' localuser" 

をしかし、それはそれは、ディレクトリを見つけることができないと言います。私はちょうどコマンドを微調整する必要があるように見えますが、私はそれを理解することはできません誰も助けることができますか?

+0

通常、プログラムが "bashにコマンドを送る"とき、プログラムが 'execl("/bin/bash "、" -c "、yourcommand、NULL);を起動することを意味します。つまり、文字列をエスケープしないでください。 'bash -c something'コマンドを書こうとしていないのは、他のシェルを経由していることを意味するからです。 –

答えて

3

これは正しい方法で引用することです。これを行う方法は複数あります。私はこのような場合のために動作するように二重引用符を簡単に見つける:

echo "su -c \"ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar\" localuser" 

プリント:

su -c "ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar" localuser 

私はあなたが探しているものだと思います。つまり、外側の二重引用符内の二重引用符を\"でエスケープします。だから、試してみてください。ここでは、文書が便利になるところ

/bin/bash -c "su -c \"ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar\" localuser" 
+0

偉大な人私は十分にあなたに感謝することはできません。私はそれを理解しようとしている2時間ラウンドを乱すされています。それは今素晴らしいです – Guerrilla

3

これは、次のとおりです。-cオプションが削除されました

bash <<'END' 
su -c "ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar" localuser 
END 

注:bashが標準入力からコマンドを読み込みます。

関連する問題