2017-01-25 13 views
0

ここに私のbash(?シェル)スクリプトがあります。

command="ssh [email protected]$ip"; 
command2="\"ls /;bash\""; 
xfce4-terminal -x sh -c "$command $command2; bash" 

は、サーバーに接続し、正常に動作します

ls/
のコマンドを実行します。

しかし、その代わりにls / ..
の私は、このコマンドを実行します:

echo $SSH_CONNECTION | awk '{print $1}' 

私は上記のコードで "ls /" を置き換え、それが接続されているとすぐに、 それは単にプリント空白行。

私の理解に基づいて、コードはものがエスケープされていないので、それがサーバーに到達する前にローカルで実行されています。

私は手動で私のリモートサーバー上でこのコードを貼り付ける場合は...

echo $SSH_CONNECTION | awk '{print $1}' 

それだけで正常に動作します。印刷する内容を正確に印刷します。

そこで質問です:バックスラッシュは私のコードで行くどこ?

私はそれは単にバックスラッシュの束をしようとしてように聞こえる知っている... 何かが動作するまで。

多くの方法を試しました。私は3倍と6倍のバックスラッシュで物事を逃れようとしました。

更新

これは十分ではありません。
それでも、空白行が接続されるとただちに印刷されます。

command="ssh [email protected]$ip"; 
command2="\"echo \$SSH_CONNECTION | awk '{print \$1}';bash\""; 
xfce4-terminal -x sh -c "$command $command2; bash" 

更新の答えの1から2

..

コードは以下のいい作品が、私はないですので、それは私の目には「非光」または多分ちょうど私の心に見えますエグゼクティブと右から左への配管に使用されましたか?

command="ssh -t [email protected]$ip"; 
command2="\"awk '{ print \\\$1 }' <<< \\\$SSH_CONNECTION; exec \\\$SHELL\"" 
xfce4-terminal -x sh -c "$command $command2; bash" 

アップデートの回答から3

..

command2='"echo \"\$SSH_CONNECTION\" | awk '"'"'{ print \$1 }'"'"'; exec \$SHELL"' 

も大丈夫動作しているようです。

"exec"コマンドは "light"ではないことを私に思い出させるので、私はまだ "exec"コマンドを使わないで解決策を探しています。ので、多分それだけで認知

更新4です:

は「幹部\ $ SHELLを」判明したコードの一部ではありませんでした。それは単に "bash"コマンドの代わりにsshにログインしていただけです。

情報はbash コマンドよりもリソース消費が少ないと言われていますが、将来検討される予定です。

今のところこれが最終結果であるようです。

command2='"echo \"\$SSH_CONNECTION\" | awk '"'"'{ print \$1 }'"'"';bash"' 

それは単純に左から右への配管は非常に合理的に見える...

更新5

最終的なコードは次のとおりです。

command="ssh -p 2201 -t [email protected]$ip"; 
command2='"echo \"\$SSH_CONNECTION\" | awk '"'"'{ print \$1 }'"'"';bash"' 
xfce4-terminal -x sh -c "$command $command2; bash" 
+0

代わりに一重引用符を使用してみるとよいでしょう。 varはローカルで評価されません(awk argを変更して二重引用符を使用する必要があります):command = 'echo $ SSH_CONNECTION' –

+0

進捗状況: 'command2 =" \ "{echo 'aaaa'; } | tail -c 2; bash \ ""; ' –

+0

あなたは' exec'なしで同じことをすることができますが、「好きではないから」というのは、それを使わないのが良い理由ではありません。 –

答えて

1

あなたが二回エスケープする必要があります。1回SSHの場合は、一度シェルコマンドを入力するとxfce4-terminalになります。私はxtermの代わりxfec4-terminalでこれをテストしてみたが、それは同じでなければなりません:

$ cmd1='ssh -t [email protected]' 
$ cmd2="\"awk '{ print \\\$1 }' <<< \\\"\\\$SSH_CONNECTION\\\"; exec \\\$SHELL\"" 
$ xfce4-terminal -x sh -c "$cmd1 $cmd2" 

私は擬似端末を割り当てる-tを追加しました、と私はここでは、文字列の代わりに、echoとパイプを使用します。

サブシェルでBashを生成する代わりに、私はexec $SHELLを使用しています。

cmd2三重バックスラッシュの代わりに、単一引用符それがあるが、単一引用符で囲まれた文字列に単一引用符を取得するには、扱いにくい'"'"'を使用する必要があります。

cmd2='"awk '"'"'{ print \$1 }'"'"' <<< \"\$SSH_CONNECTION\"; exec \$SHELL"' 
+0

は問題なく動作します。しかし、以前はシェルの "exec"コマンドを使用していたことがありません。 PHPでのみ。私はこれが "重い"(リソース消費)ではないことを願っています..デザイン(方法)? "エグゼクティブ"の部分とトリプルは、これが "重い"ルートを取っているのかどうか不思議に思っています。物事は右から左に..ではなく、 "配管"のように。私には完全にエイリアンですが、動作します。 –

+0

'exec bash'はちょうど' bash'よりも軽いので、子プロセスを生成するのではなく、プロセスを 'bash'に置き換えます。また、 'echo'の代わりにhere-string(' <<< '構造体)とパイプを使うと、サブプロセスも保存されます。あなたが 'echo'とパイプを好むなら、' cmd2 = '"echo \" \ $ SSH_CONNECTION \ "| awk'" '"' {print \ $ 1} '' '"'; exec \ $ SHELL "'代わりに。 –

1

の代わりに対処しますすべてのエスケープする問題は、別の方法で変数にアクセスするだけです。

echo $SSH_CONNECTIONの代わりにprintenv SSH_CONNECTIONを代用してください。ドル記号がないので、ローカルシェルは変数を展開しません。

+0

残りのコマンド、特にawkが 'SSH_CONNECTION'の出力の最初の部分を取得するために、まだ引用符が残っています。 –

+0

この記事の今後の親愛なる読者。私は他の答えを選んだが、この答えはおそらくそれの背後にある多くの知性を持っていることに注意すべきである。なぜなら、 "env"のものは他のものよりも "コア"であるからです。この回答がawkや何かを追加して、それが印刷する3つのアイテムからipを一つずつ出すなら、それは私が選んだ答えだろう。 –

関連する問題