sudo dengan kata sandi dalam satu baris perintah?

115

Pada hari-hari yang sibuk, saya ingin berlari

$ ./configure && make && sudo make install && halt

pada malam hari dan pergi tidur, berharap aplikasi akan terinstal secara otomatis. Tapi yang saya lihat pada hari berikutnya adalah layar tempat sudo meminta saya kata sandi. Jadi bagaimana saya bisa menjalankan sudo dengan kata sandi dalam satu baris perintah, atau adakah metode lain untuk melakukan ini?

Jichao
sumber
Anda harus haltmenjalankannya sebagai root.
Keith Thompson
1
Tidak sudomemiliki batas waktu 15 menit? Tidak bisakah Anda menjalankan, mengatakan, sudo lsatau sesuatu yang serupa, memasukkan kata sandi Anda, dan kemudian menjalankan perintah di atas, sudomasih memiliki hak istimewa? (Saya tidak dapat menguji ini saat ini, kalau tidak saya akan memposting ini sebagai jawaban.)
Matt
1
Batas waktu aktif sudodapat dikonfigurasi. Orang yang sadar akan keamanan (alias paranoid, seperti saya) mengaturnya menjadi nol ... :-)
dda

Jawaban:

173

Ya, gunakan -Ssakelar yang membaca kata sandi dari STDIN:

$echo <password> | sudo -S <command>

Jadi untuk kasus Anda akan terlihat seperti ini:

$./configure && make && echo <password> | sudo -S make install && halt

tentu saja, ganti <password>dengan kata sandi Anda.

John T
sumber
42
Jelas, seseorang tidak ingin menjalankan ini jika ada bahaya orang lain melihat kata sandi dalam sejarah shell.
Brett Daniel
mencari cara cepat untuk menjalankan perintah istimewa pada host jarak jauh dan ini berfungsi, terima kasih.
nelaaro
13
Jika Anda memutuskan untuk menggunakan 'echo <password> | Opsi sudo -S ', ​​untuk menghindari mengekspos kata sandi pada histori perintah, mulai perintah dengan karakter SPACE. Tentu saja, opsi terbaik adalah menyalurkan kata sandi dari file yang aman.
Shannon Haworth
Anda mungkin ingin menggunakannya jika Anda memiliki kata sandi dalam $ VARIABLE (bahwa Anda dapat memiliki ketentuan dengan sops misalnya)
Natim
9 tahun kemudian dan masih bekerja seperti pesona :)
WinEunuuchs2Unix
10

Anda dapat mengganti baris perintah dengan ini:

$sudo su

$./configure && make && make install && halt

Anda akan diminta untuk memasukkan kata sandi Anda segera, kemudian seluruh perintah akan dijalankan sebagai superuser.

CarlF
sumber
8
versi alternatif (dan mungkin lebih disukai) dari ini:sudo sh -c "./configure && make && make install && halt"
quack quixote
2
Tapi bukankah semua file kompilasi yang dihasilkan memiliki izin superuser? Ini akan mencegah Anda menjalankan ./configure && menjadikannya sebagai pengguna biasa nanti.
user45909
Ya, user45909, Anda benar. Secara pribadi saya tidak pernah menjalankan ulang ./configure && kecuali setelah mengunduh pembaruan paket utama, tapi saya mungkin tidak tipikal.
CarlF
10

Beberapa solusi lain memiliki kelemahan yang tidak perlu dijalankan ./configuredan di make-root.

Ini agak berbelit-belit, tetapi harus bekerja:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Perhatikan penggunaan tanda kutip ganda untuk memungkinkan $USERdiperluas oleh shell (non-root).

Saya mungkin juga menambahkan sleep 60sebelum haltperintah. Saya kadang-kadang melakukan hal-hal seperti ini, mengharapkan perintah untuk berjalan untuk waktu yang lama, tetapi ada yang tidak beres dan segera berakhir; yang sleepmembuat saya membunuh perintah sebelum sistem dimatikan. Atau Anda dapat menggunakan shutdownargumen waktu.

Keith Thompson
sumber
9

Anda juga dapat mengonfigurasi sudo dengan visudoagar pengguna dapat menggunakan make as sudo tanpa kata sandi.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
Natim
sumber
9

Setel HISTIGNORE ke " sudo -S "

$ export HISTIGNORE='*sudo -S*'

Kemudian berikan kata sandi Anda dengan aman ke sudo:

$ echo "your_password" | sudo -S -k <command>

"HISTIGNORE" berarti tidak menyimpan perintah ini ke dalam sejarah. Itu adalah sejarah dalam memori atau file "~ / .bash_history".

Misalnya, di bawah ini akan dengan aman menyalurkan kata sandi Anda ke perintah sudo, tanpa mempertahankan riwayat kata sandi Anda.

"-S", artinya menggunakan stdin untuk kata sandi,

"-K" berarti mengabaikan kredensial yang di-cache untuk memaksa sudo untuk selalu bertanya. Ini untuk perilaku yang konsisten.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

Kelemahan dari metode di atas adalah bahwa jika Anda ingin melihat perintah yang Anda jalankan dalam sejarah nanti mereka tidak akan ada di sana. Metode lain adalah memperbarui cache kredensial otentikasi sudo (default diaktifkan dengan batas waktu 5 menit), lalu jalankan sudo secara terpisah. Tetapi kekurangannya adalah Anda harus mengetahui cache 5 menit.

Sebagai contoh:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

Catatan saya menjalankan sudo sebelum setiap perintah untuk memastikan bahwa cache sudo diperbarui, karena defaultnya adalah 5 mintues. Ya, whoami seharusnya tidak memakan waktu 5 menit, tetapi saya pikir sebaiknya dijalankan sebelum setiap perintah untuk konsistensi. Anda juga dapat memasukkan "export HISTIGNORE = ' sudo -S'"di file ~ / .bashrc Anda, lalu muat dengan". ~ / .bashrc "atau logoff lalu login. Namun, saya berpikir untuk menggunakan ini untuk tujuan skrip, jadi saya akan menyimpannya di bagian atas semua skrip saya untuk praktik keamanan terbaik. Mengatur" echo "" | sudo -S -v "ke variabel sebagai gantinya mungkin juga merupakan ide yang baik, kemudian jalankan saja variabel sebelum setiap perintah yang membutuhkan hak akses root, lihat komentar Janar." Komentar John T "juga harus menyertakan parameter" -k " , seolah-olah Anda menjalankan "sudo -S" tanpa "-k" dan cache otentikasi sudo sudah memiliki kredensial Anda (dan masih valid, cache otentikasi sudo default adalah 5 menit) maka bash akan menjalankan kata sandi Anda sebagai perintah sebagai gantinya, yaitu buruk.

pengguna393365
sumber
1
Sama seperti catatan kecil tentang membuat hal-hal yang tidak tersedia dalam sejarah, jalankan perintah Anda dengan satu spasi di depannya. Untuk beberapa alasan ini menyebabkan sejarah mengabaikannya.
Matt Fletcher
4

Catatan, saya menemukan bahwa metode tidak berfungsi pada versi sudo yang lebih lama, khususnya "Sudo versi 1.6.7p5":

$ echo "<your_password>" | sudo -S -k whoami

Sedangkan metode ini tidak berfungsi pada sudo versi lama dan baru:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
Darren DeHaven
sumber
Ini bukan jawaban untuk pertanyaan awal. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka - Anda selalu dapat mengomentari posting Anda sendiri, dan setelah Anda memiliki reputasi yang cukup Anda akan dapat mengomentari posting apa pun .
DavidPostill
@ Darren DeHaven: Bisakah Anda jelaskan bagaimana ini menjadi jawaban untuk pertanyaan yang diajukan di sini?
Renju Chandran chingath
4

Anda juga dapat melakukan ini:

sudo -S <<< "password" command
Jahid
sumber
hanya ini yang bekerja untuk saya di mac os.
Mehdico
2

Jika Anda ingin lebih berhati-hati, Anda dapat membuat skrip, mengubah izin file sehingga hanya root yang dapat membaca dan mengedit dan kemudian jalankan saja.

Contoh:
1) Buat file:

gedit ~/.easy.install  

2) Tempel ini dan simpan:

./configure && make && echo <password> | sudo -S make install && halt  

3) Jadikan itu executable:

sudo chmod +x ~/.easy.install  

4) Ubah izin file sehingga hanya root yang dapat membaca dan mengeditnya:

sudo chmod 700 ~/.easy.install  

5) Jalankan:

~/.easy.install  

Nikmati ;-)

desgua
sumber
echo <password> masih akan muncul di daftar proses dan jika seseorang beruntung dengan ps aux pada saat yang tepat, mereka dapat melihat kata sandi dalam teks yang jelas. Lebih baik menyimpan kata sandi ke file dan gunakan <untuk mengalihkan dari file ke sudo.
bobpaul
1

Menyiapkan sudo seperti itu berbahaya jika seseorang melihat fakta bahwa sudo tidak memerlukan kata sandi di akun Anda. Kecuali Anda tahu apa yang Anda lakukan, jangan lakukan itu. Saya sudah sering mengalami hal itu di program A + Pelatihan lokal saya dengan komputer eksperimental saya ... -_-

Apa yang dikatakan John T. kedengarannya bagus, kecuali masih ada risiko menemukan kata sandi dalam sejarah shell. Apa kata CarlF terdengar lebih baik, tetapi jika satu perintah gagal, komputer masih akan berjalan dengan hak pengguna super.

Waktu.
sumber
0

Secara pribadi saya melakukan hal yang sama seperti yang dijawab John T pada 9 November 2009 di 2:47, saya juga meningkatkan jawaban saya sesuai dengan petunjuk jawabannya, terima kasih.

Perbedaannya adalah saya cenderung menggunakan variabel, seperti:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

Dengan cara itu saya dapat dengan mudah menggunakan variabel tambang alih-alih sudo,

$AutoSuDo apt-get update;

Itu cukup berguna dengan beberapa skrip yang lebih panjang. Saya terutama menggunakan ini untuk komputer pribadi orang lain, yang harus saya pertahankan.

Saya juga merekomendasikan untuk memperhatikan:

  • desgua menjawab pada 19 April '11 pukul 23:56
  • user224306 komentar pada 14 Mei 13 pada 17:38 untuk jawaban John T pada 9 November 2009 pada 2:47
Janar
sumber
0

Masalahnya teratasi. Misalnya, ke root pengguna:

echo -e 'password\npassword\n' | sudo passwd root
Jerson Martínez
sumber
Apa yang dilakukan flag -e, @jerson Martinez?
user674669
1
Bendera -e untuk gema memungkinkannya mengartikan urutan tertentu sebagai memiliki makna khusus.
Jerson Martínez