web-dev-qa-db-ja.com

ユーザー入力で複数のコマンドをターミナルストップに貼り付ける

いくつかの連続するコマンドをユーザー入力のあるコマンドでターミナルストップに貼り付けます。例:

read VAR
echo $VAR

または

select VAR in 1 2 3; do break; done
echo $VAR

echo $VARが貼り付け/実行されていません。

ただし、1行にすべてのコマンドを記述しても問題はありません。

read VAR; echo $VAR

しかし、これはより多くのコマンドが続く場合には好ましくありません。


なぜこれが当てはまり、どのように回避するのですか?

私のユースケースは、サービスドキュメントにいくつかの繰り返しコマンドがあることです。
もちろんスクリプトを書くことはできますが、それは私がやろうとしていることではなく、読み取りアクセスのみのシステムでは不可能かもしれません。

3
pLumo

非常に快適な方法は次のとおりです

ターミナルに次のように入力してください:

(paste-your-multiline-script-here) enter

長い説明

  1. ターミナルでは、(で始まります

    オプション:押す enter (フォーマット上の理由のみ)

  2. これで、複数の行を貼り付けることができます

    例えば。:
    echo hello
    echo world

    別の方法:行ごとに入力/貼り付け(各行を enter キー)。

  3. 最後に、ファイナライズ)を入力して、 enter 再び、貼り付けられた/入力された行全体を実行します。

少し機能する例(1行ずつ貼り付ける場合) enter

anderson@tp ~ % (
\`subsh> echo hello
\`subsh> echo world
\`subsh> )
hello
world
anderson@tp ~ % 

簡単な作業例(スクリプト全体を貼り付ける場合)

anderson@tp ~ % (
\`subsh> echo hello
echo world
\`subsh> )
hello
world
anderson@tp ~ %

フォーマットを無視した小さな作業例(スクリプト全体を貼り付けるため)

anderson@tp ~ % (echo hello                                                
echo world)
hello
world
anderson@tp ~ % 
6
Anderson

次の2つのコマンドをシェルに貼り付けると、

read VAR
echo $VAR

...最初のものはシェルにVARという名前の変数にテキスト行を読み込むように指示します。その値を次の行に入力します。たまたま実行されると思っていたコマンドです。

VAR変数の値を出力すると、次のように表示されます。

$ printf '%s\n' "$VAR"
echo $VAR

selectメニューでも同じことが起こります。

ドキュメント/コマンドでユーザーが値を入力することを期待している場合は、そのためのコメントを挿入することをお勧めします。

read VAR

(ユーザーが値を入力)

echo $VAR
3
Jeff Schaller

これは\コピーする前に各行の終わりに。

2
Anderson

あなたはそれをあなたがそれをしていたのとまったく同じようにあなたが望むようにこの仕事を得ることができます。私はいつもこれをします。

Zshと、貼り付けをurxvtのような特別なエスケープシーケンスで囲んでいるターミナルを使用している場合、デフォルトで希望どおりに機能します。 bashを使用している場合は、bind 'set enable-bracketed-paste on'を実行して、貼り付けブラケットの解釈をアクティブにする必要があります。次に、Enterキーを押すのを待ってから、貼り付けた内容を実行します。この点で、bashとzshの違いは、bashが履歴に貼り付けたコマンドを分離することです。たとえば、2行の場合、zshがコマンドを保持しながら、Up、Up、Enter、Up、Up、Enterを押す必要があります。貼り付けは、行数に関係なく、履歴内で1つとしてグループ化されます。

これについては、以下の回答で詳しく説明しています。 2番目のものは私のもので、ブラケット貼り付けをサポートする端末の表が含まれています。最終的にurxvtを使用する場合は、質問にあった脆弱性を回避するために、回答に含めた拡張機能をインストールすることをお勧めします。

https://security.stackexchange.com/a/52655/132634

https://security.stackexchange.com/a/184112/132634

編集:ちなみに、見逃した場合に備えて、より明確にするために、これを行わない場合(角かっこ貼り付けを使用)、Webサイトから貼り付けるときにシェルコードインジェクションを利用できます。結局のところ、Webサイトはあらゆる方法でコードを隠し、知らないうちにコピーしてしまう可能性があります。

このサイトをチェックして、脆弱かどうかを確認してください。

http://thejh.net/misc/website-terminal-copy-paste

実行しているようです:

git clone git://git.kernel.org/pub/scm/utils/kup/kup.git

実際には、あなたはこのようなものを実行しているでしょう(私は印刷できないエスケープバイトを削除しました):

git clone [201~/dev/null; clear; echo -n "Hello ";whoami|tr -d '\n';echo -e '!\nThat was a bad idea. Don'"'"'t copy code from websites you don'"'"'t trust!
Here'"'"'s the first line of your /etc/passwd: ';head -n1 /etc/passwd
git clone git://git.kernel.org/pub/scm/utils/kup/kup.git 
1
JoL