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
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 <example.com> login <username> password <password>
Catatan:
https://
atau mirip! Hanya hostname.mesin
', 'login
', dan 'password
' hanya kata kunci; informasi aktual adalah barang setelah kata kunci tersebut.Atau hal yang sama tapi berbeda sintaks
curl http://username:[email protected]/test/blah?something=123
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).
curl -X GET -u username:password {{ http://www.example.com/filename.txt }} -O
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:
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.
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.
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
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.
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!
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
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
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='https://example.com' printf "Username: " baca username printf "Password " stty -echo # menonaktifkan bergema input pengguna, POSIX setara untuk 'baca -s' perl -e ' saya $val=<STDIN>; chomp $val; cetak STDERR "\n"; # kita perlu untuk memindahkan garis depan, tetapi tidak mengirim sebuah baris baru ke pipa cetak $val; ' | 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' 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'
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=
kucing "${filepath" | sed -e "s/^/-u ${username}:/" | keriting --url "${url}" -K-
rm "${filepath" # don't lupa untuk menghapus file ketika selesai!! unset username ``