sudoコマンドの後、クリップボードから複数のコマンドを貼り付けると中断されます。

sudoコマンドの後、クリップボードから複数のコマンドを貼り付けると中断されます。

SSH経由で接続するCentOSシステムは2つあります。そのうちの1つでは、クリップボードの複数のコマンドを貼り付けると、sudoコマンドがないと、そのコマンドはすべて実行されます。そうであれば、そのタスクを実行して他のすべてのコマンドをスキップします。例えば。 :

$ echo aa
sudo echo bb
echo cc

結果:

aa
bb

どんなsudoコマンドが出ても、前後にいくつのコマンドが出ても構いません。に設定されてbind -vいますenable-bracketed-pasteoff

他の例:

$ sudo echo dd ;\
echo ee
echo ff

結果:

dd
ee

他のCentOSではこれは起こりません。なぜこれが起こるのか、そして貼り付けたコマンドを修正せずに問題を解決する方法は何ですか?

編集するksh:そのようなことは起こらないことを理解してください。テストする他のシェルをインストールすることはできません。

答え1

これは意図しない標準入力消費事例のように見えます。

対話型セッションに貼り付けるすべての項目は、その時点でフォアグラウンドで実行されるコマンドで使用できる標準入力データであり、通常は速度(または速度)に関係なく順番に実行できるすべてのコマンドで共有(および使用可能)されます。入力/貼り付けも可能です。各コマンドには、実行時に使用可能な標準入力データの一部または全部を使用する機会があります。

sudo実際に積極的に実行されるコマンドの1つです。食事後 みんな標準入力もし特に、企業環境ではセキュリティ上の理由からこれを行うように構成されています。この場合、sudo貼り付けたテキスト(後続のコマンドなど)が使用されます。

/etc/sudoers*この動作が発生しているホスト上のファイルを表示できる場合は、そのファイルにまたは(またはその両方)の行設定があるかどうかを確認するか、アカウントまたはグループにすることも、Defaults正確なコマンドを実行しているだけです。実際にシステム管理者がそうすると、実際には別のシステム全体のプラグインが設定されている可能性があります(可能性は低いが可能です)。use_ptylog_inputALLsudo/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実行する前にシェルを終了することです。

貼り付けたコマンドを変更せずにこの問題を解決するには、次の方法をいくつか試してください。

  1. 他のシェルを使用する:上記のようにKornシェル(ksh)を使用すると、この問題は発生しません。他のシェル(BashやZshなど)を使用して、動作が変更されていることを確認できます。

  2. サブシェルの使用:コマンドをサブシェルにグループ化し、次を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は、環境をより慎重に調査する必要があります。

関連情報