$!@ ``などの特殊文字を含むパスワードをBashスクリプトで読むためのベストプラクティス

$!@ ``などの特殊文字を含むパスワードをBashスクリプトで読むためのベストプラクティス

stdinBashスクリプトの変数からパスワードを読み取ろうとしています。その後、この変数を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"

関連情報