一部の連続コマンドを端末に貼り付けると、ユーザーが入力したコマンドで停止します。例:
read VAR
echo $VAR
または
select VAR in 1 2 3; do break; done
echo $VAR
echo $VAR
貼り付け/実行されていません。
ただし、すべてのコマンドを1行に入力すると機能します。
read VAR; echo $VAR
しかし、より多くのコマンドが続く場合、これは最初の選択ではありません。
なぜこれが起こり、どのように解決するのですか?
私のユースケースは、サービス文書に繰り返しコマンドがあることです。
確かにスクリプトを書くことはできますが、そうしたくないので、読み取り専用アクセス権を持つシステムでは不可能かもしれません。
答え1
非常に快適な方法は次のとおりです。:
端末に次のように入力します。
(
paste-your-multiline-script-here
)
enter
詳細な説明:
ターミナルから始まります。
(
オプション:クリックenter(フォーマットの場合のみ)
これで複数行を貼り付けることができます
たとえば、
echo hello
echo world
代替案:1行ずつ入力/貼り付け(enter各行をキーで完了)。
最後に、ターミナルを入力して
)
もう一度クリックすると、貼り付けるか、enter入力した行全体が実行されます。
小さな作業例(一行ずつ貼り付け用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 ~ %
答え2
次の2つのコマンドをシェルに貼り付けるとき:
read VAR
echo $VAR
...最初はシェルにテキスト行を変数という名前で読み取るように指示しますVAR
。次の行に値を指定すると、実行されると思われるコマンドになります。
変数の値を印刷すると、VAR
以下が表示されます。
$ printf '%s\n' "$VAR"
echo $VAR
メニューでも同じことが起こりますselect
。
ドキュメント/コマンドがユーザーから値を期待する場合は、次のコメントを挿入することをお勧めします。
read VAR
(ユーザーが値を入力する)
echo $VAR
答え3
\
コピーする前に各行の末尾に配置してください。
答え4
必要に応じてこれを行うことができます。私はいつもこれをする。
zshと特別なエスケープシーケンス(例:urxvt)で貼り付けをラップするターミナルを使用している場合は、既定で既に必要な方法で機能します。 bashを使用している場合は、単に実行して貼り付け括弧解析を有効にできます bind 'set enable-bracketed-paste on'
。次に、貼り付けた内容を実行する前にEnterキーを押すまで待ちます。これに関してbashとzshの違いは、bashは貼り付けたコマンドをレコードに分割するため、2行の場合はUp、Up、Enter、Up、Up、Enterを押す必要があり、zshは貼り付けたコマンドをGoに保つことです。履歴には数行あっても上に入ります。
詳細は以下の回答に記載されています。 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