Saya ingin mengakses URL yang memerlukan nama pengguna / kata sandi. Saya ingin mencoba mengaksesnya dengan ikal. Saat ini saya sedang melakukan sesuatu seperti:
curl http://api.somesite.com/test/blah?something=123
Saya mendapatkan kesalahan. Saya kira saya perlu menentukan nama pengguna dan kata sandi bersama dengan perintah di atas.
Bagaimana saya bisa melakukan itu?
curl
credentials
pengguna246114
sumber
sumber
print -- '-u username:password' > somewhere && curl -K somewhere http://...
--netrc-file
) lebih aman. Itu membuat kata sandi dari sejarah, ps, skrip Anda, dll. Itu adalah satu-satunya bentuk yang saya gunakan di semua skrip saya dan untuk semua penggunaan terotentikasicurl
.Lebih aman untuk dilakukan:
... sebagai melewatkan string pengguna / kata sandi biasa pada baris perintah, adalah ide yang buruk.
Format file kata sandi adalah (sesuai per
man curl
):catatan:
https://
atau serupa! Hanya nama hostnya.machine
', 'login
', dan 'password
' hanyalah kata kunci; informasi aktual adalah barang setelah kata kunci tersebut.sumber
-K <file>
atau--config <file>
untuk menerima flag curl melalui file atau input standar. (Peringatan: jangan bingung dengan-k
atau--insecure
!).netrc
file cleartext dengan izin yang tepat, sehingga hanya pengguna Anda yang dapat membacanya, daripada mekanisme lain (mis. Argumen baris perintah) yang memungkinkan pengguna lain membaca informasi.Atau hal yang sama tetapi sintaks yang berbeda
sumber
start "" "http://username:[email protected]/test/blah?something=123"
. Itu bisa diluncurkan dari mana saja. Itu juga berlaku untuk login ftp; DAnda juga dapat mengirim nama pengguna dengan menulis:
Curl kemudian akan meminta kata sandi Anda, dan kata sandi tersebut tidak akan terlihat di layar (atau jika Anda perlu menyalin / menempelkan perintah).
sumber
Untuk meneruskan kata sandi dalam skrip (mis. Mencegahnya agar tidak muncul dengan ps aux atau log), Anda dapat melakukannya dengan flag -K (baca config from stdin) dan heredoc:
sumber
--config
opsi (-K) ... mungkin solusi yang lebih baik adalah dengan memasukkan "--user user: password" ke dalam file dan sederhananya-K the file
sehingga Anda hanya memiliki satu salinan kata sandi daripada salinan di setiap skrip . Jauh lebih mudah untuk mengamankan satu file.cat "${password_filepath}" | sed -e "s/^/-u ${username}:/" | curl --url "${url}" -K-
. Saya harus meletakkan-K-
sebelum url untuk macOS bash lama, YMMV.Biasanya perintah CURL disebut sebagai
jika Anda tidak memiliki kata sandi atau ingin melewatkan prompt perintah untuk meminta kata sandi, biarkan bagian kata sandi kosong.
yaitu
curl https://example.com\?param\=ParamValue -u USERNAME:
sumber
sumber
Untuk membiarkan kata sandi paling tidak muncul di Anda
.bash_history
:sumber
ps auxw |grep curl
pada waktu yang tepat. Demikian pula, kata sandi akan dicatat jika dijalankan melaluisudo
cukup mudah, lakukan di bawah ini:
sumber
Jawaban lain menyarankan netrc untuk menentukan nama pengguna dan kata sandi, berdasarkan apa yang saya baca, saya setuju. Berikut ini beberapa detail sintaks:
https://ec.haxx.se/usingcurl-netrc.html
Seperti jawaban lain, saya ingin menekankan perlunya memperhatikan keamanan terkait pertanyaan ini.
Meskipun saya bukan ahli, saya menemukan tautan ini berwawasan luas:
https://ec.haxx.se/cmdline-passwords.html
Untuk meringkas:
Menggunakan versi terenkripsi protokol (HTTPS vs HTTP) (FTPS vs FTP) dapat membantu menghindari Kebocoran Jaringan.
Menggunakan netrc dapat membantu menghindari Kebocoran Baris Perintah.
Untuk melangkah lebih jauh, tampaknya Anda juga dapat mengenkripsi file netrc menggunakan gpg
https://brandur.org/fragments/gpg-curl
Dengan ini kredensial Anda tidak "diam" (disimpan) sebagai teks biasa.
sumber
Jelas dan sederhananya cara yang paling aman adalah dengan menggunakan variabel lingkungan untuk menyimpan / mengambil kredensial Anda. Dengan demikian perintah curl seperti:
Kemudian akan memanggil api tenang Anda dan lulus
WWW_Authentication
header http dengan nilai-nilai Base64 yang dikodekan dariAPI_USER
danAPI_HASH
. The-Lk
hanya memberitahu curl untuk mengikuti http 30x pengalihan dan menggunakan tls tidak aman penanganan (yaitu mengabaikan kesalahan ssl). Sedangkan--
dobelnya hanya bash sintaksis gula untuk berhenti memproses flag command line. Lebih lanjut,-b cookies.txt
dan-c cookies.txt
flag menangani cookie dengan-b
mengirimkan cookie dan-c
menyimpan cookie secara lokal.Manual ini memiliki lebih banyak contoh metode otentikasi .
sumber
Anda dapat menggunakan perintah seperti,
Maka kata sandi HTTP akan dipicu.
Referensi: http://www.asempt.com/article/how-use-curl-http-password-protected-site
sumber
Cara teraman untuk meneruskan kredensial ke curl adalah diminta memasukkannya. Inilah yang terjadi ketika melewati nama pengguna seperti yang disarankan sebelumnya (
-u USERNAME
).Tetapi bagaimana jika Anda tidak dapat melewatkan nama pengguna dengan cara itu? Misalnya nama pengguna mungkin perlu menjadi bagian dari url dan hanya kata sandi yang menjadi bagian dari payload json.
tl; dr: Ini adalah cara menggunakan curl dengan aman dalam hal ini:
read
akan meminta nama pengguna dan kata sandi dari baris perintah, dan menyimpan nilai yang dikirimkan dalam dua variabel yang dapat menjadi referensi dalam perintah berikutnya dan akhirnya tidak disetel.Saya akan menguraikan mengapa solusi lain tidak ideal.
Mengapa variabel lingkungan tidak aman
Mengapa tidak aman untuk mengetikkannya ke perintah pada baris perintah secara langsung Karena rahasia Anda kemudian terlihat oleh pengguna lain yang berjalan
ps -aux
karena daftar perintah yang dikirimkan untuk setiap proses yang sedang berjalan. Juga karena rahasia Anda kemudian berakhir dalam sejarah bash (setelah shell berakhir).Mengapa tidak aman untuk memasukkannya dalam file lokal Pembatasan akses POSIX yang ketat pada file dapat mengurangi risiko dalam skenario ini. Namun, ini masih berupa file di sistem file Anda, tidak dienkripsi saat istirahat.
sumber
Saya memiliki kebutuhan yang sama di bash (Ubuntu 16.04 LTS) dan perintah yang diberikan dalam jawaban gagal berfungsi dalam kasus saya. Saya harus menggunakan:
Kutipan ganda dalam
-F
argumen hanya diperlukan jika Anda menggunakan variabel, sehingga dari baris perintah... -F 'username=myuser' ...
akan baik-baik saja.Pemberitahuan Keamanan yang Relevan: seperti yang ditunjukkan oleh Mr. Mark Ribau dalam komentar, perintah ini menunjukkan kata sandi (variabel $ PASS, diperluas) di daftar proses!
sumber
Jika Anda menggunakan sistem yang memiliki aplikasi keyring Gnome, solusi yang menghindari pemaparan kata sandi secara langsung adalah dengan menggunakan gkeyring.py untuk mengekstrak kata sandi dari keyring:
sumber
Ini JAUH lebih banyak daripada yang diminta OP, tetapi karena ini adalah hasil teratas untuk meneruskan kata sandi dengan aman
curl
, saya menambahkan solusi ini di sini untuk orang lain yang datang ke sini mencarinya.CATATAN:
-s
arg untukread
perintah bukan POSIX, jadi tidak tersedia di mana-mana, jadi tidak akan digunakan di bawah ini. Kami akan menggunakanstty -echo
danstty echo
sebagai gantinya.CATATAN: Semua variabel bash di bawah ini dapat dinyatakan sebagai lokal jika dalam suatu fungsi, bukannya tidak disetel.
CATATAN:
perl
cukup umum tersedia pada semua sistem yang saya coba karena itu menjadi ketergantungan untuk banyak hal, sedangkanruby
danpython
tidak, jadi gunakan diperl
sini. Jika Anda dapat menjaminruby
/ dipython
mana Anda melakukan ini, Anda dapat menggantiperl
perintah dengan padanannya.CATATAN: Diuji dalam
bash
3.2.57 pada macOS 10.14.4. Beberapa terjemahan kecil mungkin diperlukan untuk shell / instalasi lain.Aman meminta pengguna untuk kata sandi (dapat digunakan kembali) untuk diteruskan ke ikal. Sangat berguna jika Anda perlu memanggil ikal beberapa kali.
Untuk shell modern, di mana
echo
built-in (periksa viawhich echo
):Untuk cangkang yang lebih tua, di mana
echo
ada sesuatu seperti/bin/echo
(di mana apa pun itu gema dapat dilihat dalam daftar proses):VERSI INI TIDAK BISA MENGGUNAKAN KATA SANDI , sebaliknya melihat lebih rendah ke bawah.
Jika Anda perlu menyimpan kata sandi sementara untuk suatu file, untuk menggunakannya kembali untuk beberapa perintah sebelum menghapusnya (katakan karena Anda menggunakan fungsi untuk menggunakan kembali kode dan tidak ingin mengulang kode dan tidak bisa meneruskan nilai sekitar melalui gema). (Ya, ini sedikit dibuat-buat mencari dalam bentuk ini tidak menjadi fungsi di perpustakaan yang berbeda; Saya mencoba menguranginya ke kode minimum yang diperlukan untuk menunjukkannya.)
Ketika gema built-in (ini dibuat khusus, karena gema adalah built-in, tetapi disediakan untuk kelengkapan):
Ketika gema adalah sesuatu seperti
/bin/echo
:sumber