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 untuk read
perintah bukan POSIX, jadi tidak tersedia di mana-mana, jadi tidak akan digunakan di bawah ini. Kami akan menggunakan stty -echo
dan stty 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, sedangkan ruby
dan python
tidak, jadi gunakan di perl
sini. Jika Anda dapat menjamin ruby
/ di python
mana Anda melakukan ini, Anda dapat mengganti perl
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 via 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
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.
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
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):
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
Ketika gema adalah sesuatu seperti /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