stdin
Bashスクリプトの変数からパスワードを読み取ろうとしています。その後、この変数をsshコマンドで拡張してサーバーに送信する必要があります。ここでは、パスワードは、他のコマンドへの入力として適切にエスケープされた方法で到着する必要があります。 (この場合、私のpiholeのログインパスワードを変更します)。
現在、私は次のものを持っています:
read -rs -p "Password: `echo $'\n> '`" newpass
ssh root@gate "pihole -a -p \"${newpass}\""
しかし、次のような試みもしました。
ssh root@gate "pihole -a -p ""'""${newpass}""'"
ssh root@gate 'pihole -a -p '"${newpass}"
ssh root@gate 'pihole -a -p '"${newpass}"''
ssh root@gate "pihole -a -p \'${newpass}\'"
ssh root@gate 'pihole -a -p ''\''"${newpass}"'\''
printfを使用しても:
IFS= read -rs -p "Password: `echo $'\n> '`" newpass
command=$(printf 'pihole -a -p %s\n' "$newpass")
または
IFS= read -rs -p "Password: `echo $'\n> '`" newpass
command=$(printf 'pihole -a -p '\''%s'\''\n' "$newpass")
もっとあります。しかし、このコードを使用するとa$#5!6k?h'v;z'
すべて失敗しました。そしてそこにはバックティックもありません…。
すべてのBashの専門家にとって、私の質問は次のとおりです。
パスワードを変数(ユーザーが入力できる場所)に解析する正しい方法は何ですか?文字通り何か特徴?
これには以下が含まれます。
$
!
` (backtick)
' (single quote)
"
;
#
@
\
/
~
\n
など...
ここと他のフォーラムで関連する質問をすべて読みましたが、このユースケースの解決策が見つかりませんでした。
わかりましたが、PythonやCのようなものを使用しようと提案する人がいますが、私はまだBashが何をすることができるかに興味があります。
しかし、これがBashを使用して実行するのが絶対に不可能な場合は、他のツールを使用してこれを(クリーンで安全に)実行する方法についてのアイデアにも興味があります。
事前にありがとう
答え1
いくつかの可能な解決策。
自分のプロンプトを使用する代わりに、piholeに自分のパスワードを尋ねるようにします。
ssh -t user@host pihole -a -p
read
ターゲットで独自のプロンプトを実行します。ssh -t user@host 'read -rsp "Password: " newpass && pihole -a -p "$newpass"'
以下を通してパイプします。
echo "$newpass" | ssh user@host 'read -r newpass && pihole -a -p "$newpass"'
パスワードを渡す前に読んだパスワードを引用してください。
read -rsp "Password: " newpass qnewpass=$(printf "%q" "$newpass") ssh user@host pihole -a -p "$qnewpass"
パスワードをエンコードし、反対側でデコードします。
newpass_base64=$(printf "%s" "$newpass" | base64) ssh user@host "pihole -a -p \$(echo $newpass_base64 | base64 -d)"
特殊文字をまったく使用しないでください。XKCDスタイル。 ;-)
答え2
$ echo "$pw"
$!@`',
$ echo "${pw@Q}"
'$!@`'\'','
これは可能です。しかし、bash
これがどのバージョンに導入されたのかはわかりません。この方法も機能し、より早く利用可能であるかもしれません。
$ printf %q "$pw"
\$\!@\`\'\,
# or, avoiding the command substitution
$ printf -v pw_ql1 %q "$pw"
$ echo "$pw_ql1"