Menggunakan cURL dengan username dan password?

Aku ingin mengakses sebuah URL yang membutuhkan username/password. I'd ingin mencoba mengakses dengan curl. Sekarang saya'm melakukan sesuatu seperti:

curl http://api.somesite.com/test/blah?something=123

Saya mendapatkan error. Saya kira saya perlu untuk menentukan username dan password dengan perintah di atas.

Bagaimana saya bisa melakukan itu?

Gunakan -u bendera untuk memasukkan username, dan curl akan prompt untuk password:

curl -u username http://example.com

Anda juga bisa memasukkan password pada perintah, tapi kemudian password anda akan terlihat di bash history:

curl -u username:password http://example.com
Komentar (15)

Hal ini lebih aman untuk anda lakukan:

curl --netrc-file my-password-file http://example.com

...seperti lewat polos user/password string pada baris perintah adalah ide yang buruk.

Format file password (sesuai pria ikal):

machine  login  password 

Catatan:

  1. Nama mesin harus tidak termasuk https:// atau mirip! Hanya hostname.
  2. Kata-kata 'mesin', 'login', dan 'password' hanya kata kunci; informasi aktual adalah barang setelah kata kunci tersebut.
Komentar (9)

Atau hal yang sama tapi berbeda sintaks

curl http://username:password@api.somesite.com/test/blah?something=123
Komentar (8)

Anda juga dapat hanya mengirim nama pengguna dengan menulis:

curl -u USERNAME http://server.example

Curl kemudian akan meminta anda untuk password, dan password tidak akan terlihat di layar (atau jika anda perlu copy/paste perintah).

Komentar (0)

Untuk aman melewati password di script (yaitu mencegah agar tidak muncul dengan ps auxf atau log) anda dapat melakukannya dengan -K - bendera (baca config dari stdin) dan heredoc:


curl --url url -K- 
Komentar (2)
curl -X GET -u username:password  {{ http://www.example.com/filename.txt }} -O
Komentar (1)

Biasanya perintah CURL sebut sebagai

curl https://example.com\?param\=ParamValue -u USERNAME:PASSWORD

jika anda don't memiliki password atau ingin melewatkan command prompt untuk permintaan password sederhana meninggalkan bagian password kosong.

yaitu curl https://example.com\?param\=ParamValue -u USERNAME:

Komentar (1)

Polos dan hanya menempatkan cara yang paling aman adalah dengan menggunakan variabel lingkungan untuk menyimpan/mengambil kredensial anda. Dengan demikian perintah curl seperti:

curl -Lk -XGET -u "${API_USER}:${API_HASH}" -b cookies.txt -c cookies.txt -- "http://api.somesite.com/test/blah?something=123"

Kemudian akan menghubungi anda tenang api dan lulus http WWW_Authentication header dengan Base64 encoded nilai-nilai dari API_USER dan API_HASH. The Lk hanya memberitahu curl untuk mengikuti http 30x pengalihan dan penggunaan yang tidak aman tls penanganan (ie mengabaikan kesalahan ssl). Sementara ganda -- hanya bash sintaks gula untuk menghentikan pengolahan baris perintah bendera. Selain itu, - b cookies.txt dan -c cookies.txt bendera menangani cookie dengan -b mengirimkan cookie dan -c menyimpan cookie lokal.

Pengguna memiliki lebih contoh otentikasi metode.

Komentar (2)

Untuk membiarkan password paling tidak pop up .bash_history:

curl -u user:$(cat .password-file) http://example-domain.tld
Komentar (2)

cukup mudah, lakukan langkah di bawah ini:

curl -X GET/POST/PUT  -u username:password
Komentar (2)

Jawaban yang lain telah menyarankan netrc untuk menentukan username dan password, berdasarkan apa yang saya've baca, saya setuju. Berikut ini adalah beberapa sintaks rincian:

https://ec.haxx.se/usingcurl-netrc.html

Seperti jawaban yang lain, saya ingin menekankan kebutuhan untuk membayar perhatian untuk keamanan mengenai pertanyaan ini.

Meskipun saya bukan seorang ahli, saya menemukan link ini berwawasan:

https://ec.haxx.se/cmdline-passwords.html

Untuk meringkas:

Menggunakan dienkripsi versi dari protokol (HTTPS vs HTTP) (FTPS vs FTP) dapat membantu menghindari Kebocoran Jaringan.

Menggunakan netrc dapat membantu menghindari Command Line Kebocoran.

Untuk melangkah lebih jauh, tampaknya anda juga dapat mengenkripsi netrc file menggunakan gpg

https://brandur.org/fragments/gpg-curl

Dengan kredensial anda tidak "di rest" (disimpan) sebagai teks biasa.

Komentar (0)

Cara paling aman untuk melewati mandat untuk curl akan diminta untuk memasukkan mereka. Ini adalah apa yang terjadi ketika melewati username seperti yang disarankan sebelumnya (-u USERNAME).

Tapi bagaimana jika anda dapat't pass username seperti itu? Misalnya nama pengguna mungkin perlu untuk menjadi bagian dari url dan hanya password menjadi bagian dari json muatan.

tl;dr: Ini adalah cara untuk menggunakan curl aman dalam hal ini:

read -p "Username: " U; read -sp "Password: " P; curl --request POST -d "{\"password\":\"${P}\"}" https://example.com/login/${U}; unset P U

baca akan diminta untuk nama pengguna dan password dari baris perintah, dan menyimpan nilai-nilai yang disampaikan dalam dua variabel-variabel yang dapat menjadi referensi berikutnya perintah dan akhirnya dibebaskan.

I'm akan menguraikan mengapa solusi lain yang tidak ideal.

Mengapa variabel lingkungan yang tidak aman

  1. Akses dan exposure mode isi dari variabel lingkungan, tidak dapat dilacak (ps -eww ) karena lingkungan secara implisit tersedia untuk proses
  2. Sering apps ambil seluruh lingkungan dan log itu untuk debugging atau tujuan pemantauan (kadang-kadang pada log file plaintext pada disk, terutama setelah aplikasi crash)
  3. Variabel-variabel lingkungan diwariskan ke anak proses (oleh karena itu melanggar prinsip dari least privilege)
  4. Mempertahankan mereka adalah masalah: insinyur baru don't tahu mereka ada di sana, dan tidak menyadari persyaratan di sekitar mereka - misalnya, untuk tidak melewati mereka ke sub-proses - karena mereka're tidak ditegakkan atau didokumentasikan.

Mengapa itu tidak aman untuk jenis ini ke command pada baris perintah langsung Karena rahasia anda kemudian berakhir menjadi terlihat oleh pengguna lain berjalan ps aux karena yang berisi daftar perintah yang dikirim untuk masing-masing saat ini proses yang berjalan. Juga karena anda secrte kemudian berakhir di bash sejarah (setelah the shell berakhir).

Mengapa itu tidak aman untuk memasukkannya ke dalam sebuah file lokal Ketat POSIX pembatasan akses pada berkas dapat mengurangi risiko dalam skenario ini. Namun, itu masih sebuah file pada sistem file anda, tidak terenkripsi pada saat istirahat.

Komentar (1)

Saya memiliki kebutuhan yang sama dalam bash (Ubuntu 16.04 LTS) dan perintah yang diberikan dalam jawaban yang gagal untuk bekerja di kasus saya. Saya harus menggunakan:

curl -X POST -F 'username="$USER"' -F 'password="$PASS"' "http://api.somesite.com/test/blah?something=123"

Tanda kutip ganda di -F argumen hanya diperlukan jika anda're menggunakan variabel, sehingga dari baris perintah ... -F 'username=myuser' ... akan baik-baik saja.

Keamanan yang relevan Pemberitahuan: sebagai Mr Mark Ribau poin-poin di komentar ini menunjukkan perintah password ($PASS variabel, diperluas) di processlist!

Komentar (2)

Anda dapat menggunakan perintah seperti berikut,

curl -u user-name -p http://www.example.com/path-to-file/file-name.ext > new-file-name.ext

Kemudian HTTP password akan dipicu.

Referensi: http://www.asempt.com/article/how-use-curl-http-password-protected-site

Komentar (0)

Jika anda berada pada suatu sistem yang memiliki Gnome keyring aplikasi solusi yang menghindari mengekspos password langsung adalah dengan menggunakan gkeyring.py untuk mengekstrak password dari keyring:

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
Komentar (1)

Ini JAUH lebih dari OP meminta, tapi karena ini adalah atas hasil untuk aman melewati password untuk keriting, aku'm menambahkan solusi ini di sini bagi orang lain yang tiba di sini mencari untuk itu.


CATATAN: -s arg untuk membaca perintah ini tidak POSIX, sehingga tidak tersedia di mana-mana, sehingga tidak't dapat digunakan di bawah ini. Kita akan menggunakan stty -echo dan stty echo sebagai gantinya.

CATATAN: Semua bash variabel-variabel di bawah ini malah bisa dinyatakan sebagai penduduk setempat jika dalam suatu fungsi, bukan unsetting.

CATATAN: perl cukup umumnya tersedia pada semua sistem I've mencoba karena itu menjadi ketergantungan untuk banyak hal, sedangkan ruby dan python tidak, jadi menggunakan perl di sini. Jika anda dapat menjamin ruby/python di mana anda're melakukan ini, anda dapat mengganti perl perintah dengan setara mereka.

CATATAN: Diuji di bash 3.2.57 pada macOS 10.14.4. Beberapa terjemahan mungkin diperlukan untuk kerang lainnya/menginstal.


Aman meminta pengguna untuk (reusable) password untuk lolos ke curl. Sangat berguna jika anda perlu untuk memanggil curl beberapa kali.

Untuk kerang, di mana echo built-in (check via yang echo): url='https://example.com' printf "Username: " baca username printf "Password " stty -echo # menonaktifkan bergema input pengguna, POSIX setara untuk 'baca -s' baca pass printf "\n" # kita perlu untuk memindahkan garis depan stty echo # mengaktifkan kembali bergema input pengguna echo ${pass} | sed -e "s/^/-u ${username}:/" | keriting --url "${url}" -K- unset username unset lulus

Untuk anak kerang, di mana echo adalah sesuatu seperti /bin/echo (di mana pun itu echos dapat dilihat dalam daftar proses):
VERSI INI TIDAK dapat menggunakan KEMBALI PASSWORD, lihat lebih rendah ke bawah sebagai gantinya. url=&#39;https://example.com&#39; printf "Username: " baca username printf "Password " stty -echo # menonaktifkan bergema input pengguna, POSIX setara untuk &#39;baca -s&#39; perl -e &#39; saya $val=<STDIN>; chomp $val; cetak STDERR "\n"; # kita perlu untuk memindahkan garis depan, tetapi tidak mengirim sebuah baris baru ke pipa cetak $val; &#39; | sed -e "s/^/-u ${username}:/" | keriting --url "${url}" -K- stty echo # mengaktifkan kembali bergema input pengguna unset username


Jika anda perlu untuk menyimpan password sementara ke file, untuk menggunakannya kembali untuk beberapa perintah sebelum kliring itu (katakanlah karena anda're menggunakan fungsi-fungsi untuk code re-use dan don't ingin ulangi kode dan dapat't lulus nilai sekitar melalui echo). (Ya, ini sedikit dibikin mencari dalam bentuk ini tidak fungsi di perpustakaan yang berbeda, saya mencoba untuk mengurangi mereka untuk minimum kode yang dibutuhkan untuk menunjukkan hal itu.)

Ketika echo adalah built-in (hal ini terutama dibikin, sejak echo adalah built-in, tapi yang disediakan untuk kelengkapan): `` url='https://example.com&#39; filepath="$(mktemp)" # random jalan, hanya dapat dibaca oleh pengguna saat ini printf "Username: " baca username printf "Password " stty -echo # menonaktifkan bergema input pengguna, POSIX setara untuk 'baca -s' baca pass echo "${pass" > "${filepath" unset lulus printf "\n" # kita perlu untuk memindahkan garis depan stty echo # mengaktifkan kembali bergema input pengguna

kucing "${filepath" | sed -e "s/^/-u ${username}:/" | keriting --url "${url}" -K-

rm "${filepath" # don't lupa untuk menghapus file ketika selesai!! unset username ``

Ketika echo adalah sesuatu seperti /bin/echo: `` url='https://example.com&#39; filepath="$(mktemp)" # random jalan, hanya dapat dibaca oleh pengguna saat ini printf "Username: " baca username printf "Password " stty -echo # menonaktifkan bergema input pengguna, POSIX setara untuk 'baca -s' $(perl -e ' saya $val=; chomp $val; terbuka(my $fh, ">", $ARGV[0]) or die "tidak Bisa membuka file \"$ARGV[0]\" $!"; cetak $fh $val; dekat $fh; ', "$filepath") printf "\n" # kita perlu untuk memindahkan garis depan stty echo # mengaktifkan kembali bergema input pengguna

kucing "${filepath" | sed -e "s/^/-u ${username}:/" | keriting --url "${url}" -K-

rm "${filepath" # don't lupa untuk menghapus file ketika selesai!! unset username ``

Komentar (0)