Menjalankan perintah tanpa mewarisi lingkungan orang tua


14

Apakah ada cara untuk menjalankan perintah "seolah-olah" itu ada di sesi login baru?

Saya sudah mencoba env -i. Namun, saya tidak ingin berurusan dengan berbagai variabel ENV yang harus saya atur atau hapus.

Saya juga sudah mencoba bash -c "some command"dan bash -l -c "some commmand", tetapi mereka semua menyalin lingkungan saat ini.

Yang paling dekat saya datang adalah solusi ghetto: ssh me@localhost "some command"


Gunakan /bin/bash --loginuntuk mendapatkan perilaku itu. Saya menggunakannya misalnya untuk mendapatkan yang tepat $PATH.
Daniel Beck

Itu setara dengan /bin/bash --l, yang sudah saya coba. Ini menyalin lingkungan asli. Cobalah: export SOME_VAL=something. Lalu /bin/bash --login. Lalu env | grep SOME_VAL. Nilainya akan ada di sana.
dgo.a

Jawaban:


12

Inilah jawaban yang tidak memerlukan hak sudo atau kata sandi pengguna, tetapi masih menyediakan lingkungan seperti apa yang akan Anda dapatkan dengan login baru.

env -i HOME="$HOME" bash -l -c 'your_command'

Contoh:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

Hancurkan ini untuk penjelasan:

  1. env -i HOME="$HOME": Membersihkan lingkungan. The -iset up sebuah lingkungan yang kosong dengan tidak ada variabel apapun . Ini bermasalah karena itu berarti bahwa jika Anda mencoba menjalankannya secara naif bash -litu tidak akan memuat .bash_profiledll Anda karena HOMEtidak disetel. Untuk mengurangi ini, kami secara eksplisit lulus HOME="$HOME", menciptakan lingkungan di mana HOME(dan hanya HOME) yang ditetapkan.

  2. bash -l -c ...: Menjalankan perintah yang diinginkan dalam shell login. Anda akan memerlukan shell login untuk ini karena kami mulai dari lingkungan yang bersih dan perlu memuat ulang semuanya.

Terutama:

  • Ini tidak memerlukan hak sudo ( sudoversi tidak).
  • Ini tidak perlu mengetikkan kata sandi pengguna ( suversinya tidak).
  • Ini tidak memerlukan menjalankan server SSH dan memiliki kunci tanpa kata sandi yang dapat digunakan untuk masuk kembali ke mesin ( sshversi tidak).

Terima kasih, Elliott. Terlihat sangat sederhana dan jelas ... sekarang sudah ditunjukkan kepada saya.
dgo.a

12
su -l $USER

sudo -u $USER -i

Untuk sesuatu yang bahkan lebih agresif cobalah env -i bash, tetapi itu akan menghapus semuanya termasuk $ HOME dan $ TERM.


2
Terima kasih! Perintah kedua memberi saya apa yang saya inginkan. Saya mencari lebih dari 2 jam dan tidak menemukan apa pun yang dekat dengan balasan Anda. Berdasarkan jawaban Anda, saya kembali ke man sudodan menemukan: "jika pengguna target sama dengan pengguna yang memanggil, tidak diperlukan kata sandi." ( suTampaknya selalu meminta kata sandi.) Aku benar-benar bodoh telah mengabaikan sesuatu yang begitu sederhana di paragraf pertama manhalaman :( Saya menghindari sudo sejak awal karena saya menganggap itu selalu meminta kata sandi. Terima kasih lagi!
dgo.a

1
hanya petunjuk untuk orang lain ... jika Anda masuk karena $USERAnda harus masuk sebagai root dan kemudian sudo -u ...sebagai pengguna Anda. Jika Anda hanya melakukan sudo -usebagai pengguna, Anda akan mewarisi.
Adam Gent

ini tidak bekerja, jelas, jika Anda tidak memiliki sudoakses. Apakah ada metode alternatif yang tidak memerlukan sudo?
user5359531

@ user5359531: Ya - su -l $USER.
user1686

1
yang meminta kata sandi; Saya masuk melalui otentikasi kunci ssh, jadi saya bahkan tidak tahu apa kata sandinya. Dan prompt kata sandi akan mematikan kemampuan skrip. Sejauh ini tampilannya ssh $USER@localhost <command>bekerja lebih baik
user5359531
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.