ユーザー名/パスワードが必要なURLにアクセスしたい。curlでアクセスしてみます。今私は次のようなことをしています:
curl http://api.somesite.com/test/blah?something=123
エラーが発生します。上記のコマンドでユーザー名とパスワードを指定する必要があると思います。
どうやってやるの?
ユーザー名/パスワードが必要なURLにアクセスしたい。curlでアクセスしてみます。今私は次のようなことをしています:
curl http://api.somesite.com/test/blah?something=123
エラーが発生します。上記のコマンドでユーザー名とパスワードを指定する必要があると思います。
どうやってやるの?
回答:
-u
フラグを使用してユーザー名を含めると、curlはパスワードを要求します。
curl -u username http://example.com
コマンドにパスワードを含めることもできますが、その場合、パスワードはbash履歴に表示されます。
curl -u username:password http://example.com
print -- '-u username:password' > somewhere && curl -K somewhere http://...
--netrc-file
)の方が安全だと思います。履歴、ps、スクリプトなどからパスワードを保護します。これは、すべてのスクリプトで、およびのすべての認証済み使用法で使用する唯一の形式ですcurl
。
それは安全です:
curl --netrc-file my-password-file http://example.com
...コマンドラインでプレーンなユーザー/パスワード文字列を渡すのは悪い考えです。
パスワードファイルの形式は(のman curl
とおり)です。
machine <example.com> login <username> password <password>
注意:
https://
または類似のものを!ホスト名だけです。machine
」、「login
」、および「password
」は単なるキーワードです。実際の情報は、これらのキーワードの後のものです。-K <file>
か--config <file>
、ファイルまたは標準入力を介してカールフラグを受け取ることもできます。(警告:と混同すべきでない-k
か--insecure
!)
.netrc
ので、唯一、適切に厳格なアクセス権を持つファイルを、あなたのみましょう他のメカニズム(例えば、コマンドライン引数)よりも、ユーザーはそれを読むことができ、他のユーザーが情報をお読みください。
または同じことだが構文が異なる
curl http://username:password@api.somesite.com/test/blah?something=123
start "" "http://username:password@api.somesite.com/test/blah?something=123"
ます。どこからでも起動できます。それはまた、FTPログインに適用され; D
スクリプトでパスワードを安全に渡す(つまり、ps auxfまたはログでパスワードが表示されないようにする)には、-K-フラグ(標準入力から設定を読み取る)とヒアドキュメントを使用します。
curl --url url -K- <<< "--user user:password"
--config
オプションへの参照をありがとう(-K)...おそらくより良い解決策は、「-user user:password」をファイルに入れて、単純-K the file
にすべてのスクリプトにコピーではなくパスワードのコピーを1つだけ持つことです。 。単一のファイルを保護する方がはるかに簡単です。
cat "${password_filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
。パスワードのみがファイルにあります。-K-
古いmacOS bash、YMMVのURLの前に置く必要がありました。
通常、CURLコマンドは次のように参照します
curl https://example.com\?param\=ParamValue -u USERNAME:PASSWORD
パスワードがない場合、またはコマンドプロンプトをスキップしてパスワードを要求する場合は、パスワードセクションを空白のままにします。
すなわち curl https://example.com\?param\=ParamValue -u USERNAME:
curl -X GET -u username:password {{ http://www.example.com/filename.txt }} -O
パスワードをポップアップさせないようにするには.bash_history
:
curl -u user:$(cat .password-file) http://example-domain.tld
ps auxw |grep curl
、適切なタイミングで誰かがパスワードを見ることができます。同様に、パスワードを実行するとログに記録されますsudo
かなり簡単です、以下を実行してください:
curl -X GET/POST/PUT <URL> -u username:password
他の回答は、私が読んだ内容に基づいて、ユーザー名とパスワードを指定することをnetrcに提案しています。構文の詳細は次のとおりです。
https://ec.haxx.se/usingcurl-netrc.html
他の回答と同様に、この質問に関してセキュリティに注意を払う必要があることを強調したいと思います。
私は専門家ではありませんが、これらのリンクは洞察に満ちています:
https://ec.haxx.se/cmdline-passwords.html
要約する:
使用するプロトコルの暗号化されたバージョンを(HTTPS HTTP VS)(FTP対FTPSは)避けネットワーク漏れを助けることができます。
netrcの使用をすると、コマンドラインリークを回避できます。
さらに一歩進むには、gpgを使用してnetrcファイルを暗号化することもできるようです
https://brandur.org/fragments/gpg-curl
これにより、資格情報はプレーンテキストとして "保存"(保存)されません。
単純で最も安全な方法は、環境変数を使用して資格情報を格納/取得することです。したがって、次のようなcurlコマンド:
curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"
その後、あなたの安らかなAPIを呼び出して、http渡すWWW_Authentication
Base64では、の値をコード化してヘッダをAPI_USER
してAPI_HASH
。-Lk
ただ、HTTPリダイレクト30Xに従うことをして(すなわち、SSLエラーを無視)の取り扱い安全でないTLSを使用するようにカールを伝えます。double --
は、コマンドラインフラグの処理を停止するためのbash構文シュガーです。さらに、-b cookies.txt
および-c cookies.txt
フラグはでクッキーを扱う-b
クッキーを送信し、-c
ローカルに保存する処理します。
次のようなコマンドを使用できます。
curl -u user-name -p http://www.example.com/path-to-file/file-name.ext > new-file-name.ext
次に、HTTPパスワードがトリガーされます。
リファレンス:http : //www.asempt.com/article/how-use-curl-http-password-protected-site
資格情報をcurlに渡す最も安全な方法は、資格情報を挿入するように求められることです。これは、前に提案したようにユーザー名を渡すとどうなるか-u USERNAME
です()。
しかし、そのようにユーザー名を渡すことができない場合はどうでしょうか? たとえば、ユーザー名はURLの一部である必要があり、パスワードのみがjsonペイロードの一部である必要があります。
tl; dr: これは、この場合にcurlを安全に使用する方法です。
read -p "Username: " U; read -sp "Password: " P; curl --request POST -d "{\"password\":\"${P}\"}" https://example.com/login/${U}; unset P U
read
コマンドラインからユーザー名とパスワードの両方を要求し、送信された値を2つの変数に格納します。これらの変数は、後続のコマンドで参照でき、最後に設定を解除できます。
他のソリューションが理想的でない理由について詳しく説明します。
環境変数が安全でない理由
コマンドラインでコマンドに直接入力するのは安全ではないのはなぜですか
。シークレットは、ps -aux
現在実行中のプロセスごとに送信されたコマンドを一覧表示するため、実行中の他のユーザーに表示されてしまいます。また、あなたのセクレトは(シェルが終了すると)bash履歴に残ることになります。
ローカルファイルに含めることが安全ではない理由ファイル に対する厳格なPOSIXアクセス制限により、このシナリオのリスクを軽減できます。ただし、それはまだファイルシステム上のファイルであり、保存時には暗号化されません。
私はbash(Ubuntu 16.04 LTS)でも同じ必要があり、回答で提供されたコマンドが私の場合には機能しませんでした。私は使用しなければなりませんでした:
curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123"
-F
引数内の二重引用符は、変数を使用している場合にのみ必要であるため、コマンドラインから実行して... -F 'username=myuser' ...
も問題ありません。
関連するセキュリティ通知:Mark Ribau氏がコメントで指摘しているように、このコマンドはプロセスリストにパスワード(展開された$ PASS変数)を表示します!
Gnomeキーリングアプリがあるシステムを使用している場合、パスワードを直接公開することを回避するソリューションは、gkeyring.pyを使用してキーリングからパスワードを抽出することです。
server=server.example.com
file=path/to/my/file
user=my_user_name
pass=$(gkeyring.py -k login -tnetwork -p user=$user,server=$server -1)
curl -u $user:$pass ftps://$server/$file -O
これはOPが要求するよりもはるかに大きいですが、これはパスワードを安全にに渡すための最高の結果であるためcurl
、ここに到着してそれを検索している他の人のために、これらのソリューションをここに追加します。
注:コマンドの-s
引数read
はPOSIXではないため、どこでも使用できるわけではないため、以下では使用しません。使用stty -echo
しますstty echo
代わりにます。
注:以下のすべてのbash変数は、設定を解除するのではなく、関数内でローカルとして宣言できます。
注意: perl
私は、それは多くのものの依存であることに起因するしようとしたのに対しきたすべてのシステムで利用でき、かなり一般的であるruby
とpython
されないので、使用してperl
ここに。保証できる場合ruby
/ python
これを行う場所は、perl
コマンドを同等のもので。
注:bash
macOS 10.14.4の3.2.57でテストされています。他のシェル/インストールでは、いくつかの小さな変換が必要になる場合があります。
curlに渡す(再利用可能な)パスワードを安全にユーザーに要求します。curlを複数回呼び出す必要がある場合に特に役立ちます。
現代のシェルの場合、 echo
は組み込みです(で確認which echo
)。
url='https://example.com'
printf "Username: "
read username
printf "Password: "
stty -echo # disables echoing user input, POSIX equivalent for 'read -s'
read pass
printf "\n" # we need to move the line ahead
stty echo # re-enable echoing user input
echo ${pass} | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
unset username
unset pass
古いシェルの場合、echo
は次のようなものです/bin/echo
(エコーするものはすべてプロセスリストに表示されます)。
このバージョンではパスワードを再利用できません。代わりに下を参照してください。
url='https://example.com'
printf "Username: "
read username
printf "Password: "
stty -echo # disables echoing user input, POSIX equivalent for 'read -s'
perl -e '
my $val=<STDIN>;
chomp $val;
print STDERR "\n"; # we need to move the line ahead, but not send a newline down the pipe
print $val;
' | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
stty echo # re-enable echoing user input
unset username
パスワードを一時的にファイルに保存する必要がある場合は、それをクリアする前に複数のコマンドで再利用する必要があります(たとえば、コードの再利用に関数を使用していて、コードを繰り返したくなく、エコーを介して値を渡します)。(はい、これらはこの形式で別のライブラリの関数ではないように少し工夫されています。表示するために必要な最小限のコードに削減しようとしました。)
エコーが組み込まれている場合(エコーは組み込みなので、これは特に工夫されていますが、完全を期すために提供されています):
url='https://example.com'
filepath="$(mktemp)" # random path, only readable by current user
printf "Username: "
read username
printf "Password: "
stty -echo # disables echoing user input, POSIX equivalent for 'read -s'
read pass
echo "${pass}" > "${filepath}"
unset pass
printf "\n" # we need to move the line ahead
stty echo # re-enable echoing user input
cat "${filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
rm "${filepath}" # don't forget to delete the file when done!!
unset username
エコーが次のようなものである場合/bin/echo
:
url='https://example.com'
filepath="$(mktemp)" # random path, only readable by current user
printf "Username: "
read username
printf "Password: "
stty -echo # disables echoing user input, POSIX equivalent for 'read -s'
$(perl -e '
my $val=<STDIN>;
chomp $val;
open(my $fh, ">", $ARGV[0]) or die "Could not open file \"$ARGV[0]\" $\!";
print $fh $val;
close $fh;
' "$filepath")
printf "\n" # we need to move the line ahead
stty echo # re-enable echoing user input
cat "${filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
rm "${filepath}" # don't forget to delete the file when done!!
unset username