Bagaimana cara sudo perintah dalam skrip tanpa diminta kata sandi?


107

Saya ingin mengaktifkan sistem saya secara otomatis setiap hari. Jadi saya menggunakan kode di bawah ini dalam skrip Python saya, tetapi selalu sudomeminta kata sandi:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

Bagaimana saya bisa menjalankan skrip ini tanpa sudomeminta kata sandi setiap waktu?


4
Anda harus melihat di manual motherboard atau BIOS untuk melihat apakah itu mendukung perilaku ini. Saya tahu itu menghindari pertanyaan! =] Tapi itu mungkin solusi yang cukup.
Alex Hirzel

Jawaban:


149

Harap dicatat: Metode apa pun yang melibatkan kata sandi login Anda dalam teks biasa, dalam perintah atau file, tidak aman dan TIDAK boleh digunakan!

Cara yang benar untuk melakukan pengaturan sudosehingga hanya satu perintah khusus yang Anda butuhkan, yaitu echo date... > rtc...diizinkan untuk dijalankan TANPA membutuhkan kata sandi.

Langkah 1. Buat skrip shell hanya dengan perintah itu

  • Buka gedit(atau editor favorit Anda), dan buat skrip misalnyapydatertc.sh
  • Masukkan hanya baris ini, dan simpan ke, misalnya direktori home Anda:
    tanggal gema \ '+% s \' -d \ '+ 24 jam \'> / sys / class / rtc / rtc0 / wakealarm
  • Keluar dari editor, dan dari terminal, buat skrip dapat dieksekusi dan ubah kepemilikannya menjadi root , jika tidak, pengguna lain dengan akses ke sistem Anda mungkin dapat mengeditnya dan menjalankan perintah apa pun yang mereka inginkan sebagai root tanpa perlu kata sandi Anda:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh

Langkah 2. Siapkan sudo untuk memungkinkan pydatertc.sheksekusi tanpa memerlukan kata sandi

  • Ketik sudo visudodi terminal untuk membuka file sudo permissions ( sudoers)
  • Di sekitar baris 25, Anda akan melihat baris ini: %sudo ALL=(ALL:ALL) ALL
  • Di bawah garis itu , masukkan baris berikut, di mana usernamenama pengguna Anda:
    username ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Keluar dari editor ( Ctrl+ Xjika nano )

Langkah 3. Ubah skrip python Anda untuk memanggil pydatertc.sh

  • Ubah baris ke:
    os.system ('sudo /home/username/pydatertc.sh')

Sekarang skrip Anda harus dijalankan tanpa memerlukan kata sandi DAN tanpa membahayakan keamanan akun Anda, data Anda, atau sistem Anda!


Alternatif hanya untuk wakealarm(tidak untuk penggunaan umum!):

Hanya dalam kasus khusus ini , karena /sys/class/rtc/rtc0/wakealarmfile hanya mengontrol alarm untuk sistem dan tidak berbahaya, alternatif lain untuk menghindari kata sandi adalah dengan mengambil kepemilikan file tersebut dengan chown(jika Anda adalah satu-satunya pengguna yang mengatur alarm) , atau membuatnya dapat ditulis dunia dengan chmod +666; dalam hal ini, cukup hapus sudodari panggilan Python Anda, biarkan sh -c "...."utuh.


1
Luar biasa, ini adalah cara yang benar untuk melakukannya.
roadmr

1
Jawaban yang sangat terperinci, sangat membantu, dan bagaimana tepatnya hal itu harus dilakukan.
ArtOfCode

@RobertRosati, terima kasih banyak atas saran yang Anda sarankan - Saya seharusnya tidak melupakan itu sejak awal!
ish

1
@ m-ric Apakah Anda membaca perintah di atas baris ini? "Jika tidak, pengguna lain dengan akses ke sistem Anda mungkin dapat mengeditnya dan menjalankan perintah apa pun yang mereka inginkan sebagai root tanpa perlu kata sandi Anda"
Tobias Kienzler

2
Saya menyadari jawaban ini sudah lama - tetapi masih ada masalah di sini: jika file tersebut terletak di / home / nama pengguna , maka sistem dapat dikompromikan jika direktori tersebut dapat ditulisi oleh pengguna jahat (atau login non-root yang dikompromikan) . Mereka bisa menghapus atau mengubah nama file, menempatkan script lain di tempatnya, dan berjalan bahwa script melalui sudo- tanpa password. Oleh karena itu, jauh lebih aman untuk meletakkan skrip ke direktori yang hanya dapat diubah oleh root, misalnya: / usr / sbin atau / root . Kalau tidak, itu LGTM.
NVRAM

30

Peringatan!

Menempatkan kata sandi login Anda dalam teks biasa, dalam perintah atau file, sangat tidak aman dan dapat membahayakan data pribadi Anda dan sistem Anda. Sangat disarankan untuk tidak melakukan ini bahkan jika Anda berpikir sistem Anda "pribadi" atau di "lokasi aman"!

Jika skrip hanya untuk penggunaan pribadi dan Anda telah menempatkannya di tempat yang aman dan Anda tidak takut akun Anda dicuri dan semacamnya, maka inilah solusi sederhana:

echo LOGINPASSWD | sudo -S COMMAND HERE

di mana LOGINPASSWD adalah kata sandi masuk Anda (contoh: iloveponies) dan PERINTAH DI SINI adalah perintah Anda yang muncul setelah sudo, seperti sh -c "echo da .. etc


13
@ Viswa, Harap dicatat bahwa, ini sangat sangat berbahaya untuk mengungkapkan kata sandi dalam teks biasa. Anda sangat disarankan, jangan lakukan itu
Anwar

3
-1 Jika ini sepertinya ide yang bagus, Anda akan jauh lebih baik hanya mengatur kata sandi pada akun root Anda dan menggunakan solusi z7sg; itu sama mudahnya, dan tidak menciptakan masalah keamanan yang sangat berbahaya ini.
Bryce

4
Hah! Saya memiliki 6 upvotes dan 4 downvotes pada jawaban saya :) Tetapi mengapa teman-teman, bukankah saya menghapus 'Penggunaan pribadi', 'tempat aman' dll? Tidak ada masalah keamanan kecuali Anda memberikan file ini dan Anda memiliki server ssh yang berjalan! Di mana Anda melihat masalah keamanan dengan ketentuan bahwa skrip itu untuk penggunaan pribadi dan di tempat yang aman?
hytromo

5
Diturunkan, ini adalah Jalan ke sisi gelap, dan tidak diperlukan dengan metode sudo.
Floyd

4
Ok, katakan saja padaku, bahkan jika hacker telah login sebagai pengguna sederhana ke akun Anda, bagaimana dia bisa menemukan skrip dengan kata sandi Anda di bawah / usr / share / help / lv / ubuntu-help ??
hytromo

21

Jika Anda tidak keberatan skrip berjalan pada waktu tertentu pada jam tersebut (atau siang hari), letakkan di dalam direktori home root ( /root), dan jalankan skrip dari sistem crontab ( /etc/crontab) sebagai root. Maka Anda tidak perlu berkompromi dengan keamanan Anda.

Lihat https://help.ubuntu.com/community/CronHowto untuk cara menambahkan skrip ke crontab.


4
Anda mungkin ingin menggunakannya anacronjika itu adalah desktop / laptop yang tidak berjalan 24x7
balki

Ini adalah jawaban yang berguna, misalnya jika Anda menulis skrip untuk memeriksa pembaruan, melakukan sesuatu dengan informasi itu, dan mengirim email kepada administrator tentang pembaruan yang diperlukan. Secara pribadi, banyak skrip saya digunakan untuk otomatisasi server, jadi hanya menggunakan sudo crontab -e adalah apa yang saya cenderung lakukan. +1
Rab

11

Fitur bagus lain yang terkait dari sudo yang belum disebutkan dalam jawaban terbaik di atas adalah variabel 'timestamp_timeout'. Ini adalah variabel sudo yang dapat Anda tingkatkan untuk menghemat pengetikan kata sandi interaktif.

Contoh, di / etc / sudoers (atau salah satu file yang termasuk darinya) Anda dapat memodifikasi default:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

Deskripsi lengkap dari 'man sudoers':

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

Tentu saja, ini tidak dapat membantu dalam kasus spesifik menjalankan perintah dari cron. Tapi itu hal yang baik untuk diperhatikan.


0
export MY_SUDO_PASS="user_password_here"

Untuk menguji apakah ini berfungsi:

echo $MY_SUDO_PASS
> user_password_here

Untuk menjalankan "sudo apt-get update", dan terima kata sandi dari variabel lingkungan apa yang kami buat sebelumnya:

echo $MY_SUDO_PASS | sudo -S apt-get update

Jalankan dari python (contoh mengubah kepemilikan direktori secara rekursif ke username_here):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS kata sandi get -S beralih menangkap dan meneruskan kata sandi ke sudo


Saya tidak yakin apa ini menambah jawaban yang ada saat ini dukungan BIOS terbaru membangunkan alarm ...
Penatua Geek
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.