SSH経由で接続するCentOSシステムは2つあります。そのうちの1つでは、クリップボードの複数のコマンドを貼り付けると、sudoコマンドがないと、そのコマンドはすべて実行されます。そうであれば、そのタスクを実行して他のすべてのコマンドをスキップします。例えば。 :
$ echo aa
sudo echo bb
echo cc
結果:
aa
bb
どんなsudoコマンドが出ても、前後にいくつのコマンドが出ても構いません。に設定されてbind -v
いますenable-bracketed-paste
off
他の例:
$ sudo echo dd ;\
echo ee
echo ff
結果:
dd
ee
他のCentOSではこれは起こりません。なぜこれが起こるのか、そして貼り付けたコマンドを修正せずに問題を解決する方法は何ですか?
編集するksh
:そのようなことは起こらないことを理解してください。テストする他のシェルをインストールすることはできません。
答え1
これは意図しない標準入力消費事例のように見えます。
対話型セッションに貼り付けるすべての項目は、その時点でフォアグラウンドで実行されるコマンドで使用できる標準入力データであり、通常は速度(または速度)に関係なく順番に実行できるすべてのコマンドで共有(および使用可能)されます。入力/貼り付けも可能です。各コマンドには、実行時に使用可能な標準入力データの一部または全部を使用する機会があります。
sudo
実際に積極的に実行されるコマンドの1つです。食事後 みんな標準入力もし特に、企業環境ではセキュリティ上の理由からこれを行うように構成されています。この場合、sudo
貼り付けたテキスト(後続のコマンドなど)が使用されます。
/etc/sudoers*
この動作が発生しているホスト上のファイルを表示できる場合は、そのファイルにまたは(またはその両方)の行設定があるかどうかを確認するか、アカウントまたはグループにすることも、Defaults
正確なコマンドを実行しているだけです。実際にシステム管理者がそうすると、実際には別のシステム全体のプラグインが設定されている可能性があります(可能性は低いが可能です)。use_pty
log_input
ALL
sudo
/etc/sudo.conf
とにかく貼り付けた内容をサブシェルに簡単にラップすると、問題を解決できます。
(使用しているシェルの一般的なプロンプトで開く括弧を入力してを押しますEnter。 「PS2」(「追加入力が必要」とも呼ばれる)のプロンプトが表示されます。このプロンプトでは、通常、>
必要に応じてコマンドを入力するか、クリップボードにそのまま貼り付けることができます。これらのコマンドはすぐには実行されませんが、明示的に終了するまで開く括弧で始まるサブシェルに「待機」されます。入力/貼り付けが完了したら、閉じ)括弧を入力して再入力して完了すると、Enterサブシェルは終了します。
sudo
その後、貼り付けられたコマンドは通常の(または特別な)動作で標準入力を消費する可能性があるこれらの(または他の)コマンドによって「食べられずに」最終的に実行されます。これは、関連するすべての標準入力(たとえば、貼り付け)がすでに「キューにある」サブシェルによって消費されているため、sudo
「食べる」ものが何も残っていないためです。
最後にあなたの場合enable-bracketed-paste on
会議bash
これが本質的に検出するので友達になってください貼り付けたテキストを組み合わせてタイプされたターミナルエミュレータのサポートを受けるテキスト(ターミナルエミュレータがその機能を提供する場合)
「正しく」動作しているように見える理由についてはksh
内部を詳しく調べていませんが、一見すると次のような内容をstrace
読んでいるようです。バッファサイズ標準入力は、一般的な単純化された方法で標準入力を読み取って実行するのではなく、順番に実行される個々のコマンドとして表示できます。
完全にscreen
無視するということを言えばenable-bracketed-paste on
、自分自身も熱心なユーザーではないが、screen
こう言うことができます。これは明らかに非常に「豊富な」端末ソフトウェアであり、おそらく行動bash
ターミナルエミュレータ自体なので、角かっこ貼り付け機能のためにターミナルエミュレータに送受信されたエスケープコードを妨げる(無視して削除することができます)。
答え2
この動作は、端末に貼り付けるときにシェルがコマンドシーケンスを解釈する方法に関連している可能性があります。 1つの可能な説明は、この動作が観察されるシステムのシェルがコマンドシーケンス全体を単一行として解釈し、そのコマンドが残りのコマンドをsudo
実行する前にシェルを終了することです。
貼り付けたコマンドを変更せずにこの問題を解決するには、次の方法をいくつか試してください。
他のシェルを使用する:上記のようにKornシェル(ksh)を使用すると、この問題は発生しません。他のシェル(BashやZshなど)を使用して、動作が変更されていることを確認できます。
サブシェルの使用:コマンドをサブシェルにグループ化し、次を
sudo
使用してサブシェルを実行できます。これにより、コマンドがsudo
シェルを終了するかどうかに関係なく、すべてのコマンドがサブシェル内で実行されます。たとえば、
$ (echo aa ; echo bb ; echo cc)
$ sudo sh -c '(echo aa ; echo bb ; echo cc)'
特に、貼り付けたコマンドに複雑な構文または変数拡張が含まれている場合、サブシェル方法がすべての場合に機能しない可能性があります。
これらの方法のいずれも機能しない場合は、貼り付けたコマンドを変更して正しい順序で実行する必要があります。たとえば、一連のコマンドを複数行に分割したり、シェルスクリプトを使用して任意の順序でコマンドを実行したりできます。
答え3
readline
シェル、PS1
プロンプト、またはプログラムの何かが保留PROMPT_COMMAND
中の文字を削除していると推測する危険があります。標準入力。
この2行を入力してください最初の操作が完了するまで待つ必要はありません。:
sleep 10
id
そうでない場合id
は、環境をより慎重に調査する必要があります。