Saya telah menulis skrip yang mengambil, sebagai argumen, string yang merupakan rangkaian nama pengguna dan proyek. Skrip seharusnya mengalihkan (su) ke nama pengguna, cd ke direktori tertentu berdasarkan string proyek.
Saya pada dasarnya ingin melakukan:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
Masalahnya adalah begitu saya melakukan su ... itu hanya menunggu di sana. Yang masuk akal karena aliran eksekusi telah beralih ke pengguna. Setelah saya keluar, maka hal-hal lainnya akan dijalankan tetapi tidak berfungsi seperti yang diinginkan.
Saya menambahkan su ke perintah svn tetapi perintah itu gagal (yaitu tidak memperbarui svn di direktori yang diinginkan).
Bagaimana cara menulis skrip yang memungkinkan pengguna untuk mengganti pengguna dan menjalankan svn (antara lain)?
sumber
chsh
untuk pengguna lain. Masalah saya tercantum di sini di stackoverflow.com/q/15307289/80353 Bagaimana cara menyesuaikan jawaban Anda dalam situasi saya?sudo
atausu
memiliki kepentingan sekunder, meskipunsudo
jauh lebih aman dan nyaman.Jauh lebih sederhana: gunakan
sudo
untuk menjalankan shell dan gunakan heredoc untuk memberinya perintah.(jawaban awalnya di SuperUser )
sumber
-i
untuk mendapatkansomeuser
lingkungan yang diharapkan.sudo
mungkin nyaman tetapi tidak ada gunanya jika tidak di luar kotak (seperti di AIX).su -c 'commands'
adalah jawaban yang benar.Gunakan skrip seperti berikut untuk menjalankan sisa atau sebagian skrip di bawah pengguna lain:
sumber
whoami
alih-alihid
yang akan mengembalikan nama alih-alih idsudo
mungkin nyaman tetapi tidak ada gunanya jika tidak di luar kotak (seperti di AIX).su -c 'commands'
adalah jawaban yang benar.Anda perlu menjalankan semua perintah pengguna yang berbeda sebagai skrip mereka sendiri. Jika hanya satu, atau beberapa perintah, maka inline seharusnya berfungsi. Jika banyak perintah maka mungkin yang terbaik adalah memindahkannya ke file mereka sendiri.
sumber
su -s /bin/bash
.Berikut adalah pendekatan lain, yang lebih nyaman dalam kasus saya (saya hanya ingin melepaskan hak akses root dan melakukan sisa skrip saya dari pengguna terbatas): Anda dapat membuat skrip restart sendiri dari pengguna yang benar. Misalkan ini dijalankan sebagai root pada awalnya. Maka akan terlihat seperti ini:
sumber
runuser -u $user -- "$@"
, seperti yang dinyatakan dalam su (1)exec su "$user" "$0" -- "$@"
--
sangat berguna.Gunakan
sudo
sebagai gantinyaEDIT : Sebagai Douglas menunjukkan, Anda tidak dapat menggunakan
cd
disudo
karena bukan merupakan eksternal perintah. Anda harus menjalankan perintah di subkulit untuk membuatnyacd
bekerja.Anda mungkin diminta untuk memasukkan kata sandi pengguna itu, tetapi hanya sekali.
sumber
sudo
mungkin nyaman tetapi tidak ada gunanya jika tidak di luar kotak (seperti di AIX).su -c 'commands'
adalah jawaban yang benar.Tidak mungkin mengubah pengguna dalam skrip shell. Solusi menggunakan sudo yang dijelaskan dalam jawaban lain mungkin adalah pilihan terbaik Anda.
Jika Anda cukup marah untuk menjalankan skrip perl sebagai root, Anda dapat melakukannya dengan
$< $( $> $)
variabel yang menyimpan uid / gid nyata / efektif, misalnya:sumber
Ini berhasil untuk saya
Saya memisahkan "penyediaan" saya dari "permulaan" saya.
lalu di start_env.sh saya
sumber
Terinspirasi oleh ide dari @ MarSoft tetapi saya mengubah baris seperti berikut:
Saya telah terbiasa
sudo
mengizinkan eksekusi tanpa sandi dari skrip. Jika Anda ingin memasukkan kata sandi untuk pengguna, hapussudo
. Jika Anda tidak membutuhkan variabel lingkungan, hapus-E
dari sudo.The
/usr/bin/bash -l
Memastikan, bahwaprofile.d
skrip dieksekusi untuk lingkungan diinisialisasi.sumber
sudo
mungkin nyaman tetapi tidak ada gunanya jika tidak di luar kotak (seperti di AIX).su -c 'commands'
adalah jawaban yang benar.sudo
. Faktanya, sudo tidak sesederhana itu, dalam banyak kasus Anda memerlukan bahkansudo -E
dan entri konfigurasi di sudoers.d untuk memungkinkan eksekusi tanpa tty!requiretty
. Tetapi ada banyak kasus, di mana sudo diperlukan untuk skrip yang disebut otomatis, di mana dialog kata sandi dapat mengganggu. Jadi saya tidak akan menghapusnya dari solusi standar."$@"
di dalam string berarti argumen setelah yang pertama ditambahkan ke string terpisah, tidak disertakan dalam-c
argumen. Jika Anda ingin membuatnya aman, Anda mungkinprintf -v arg_q '%q ' "$0" "$@"
dan kemudian menggunakansu "$USERNAME" -c "/usr/bin/bash -l $arg_q"
COMMANDARGS=$@
penyelesaian masalah dengan-c
. Argumen dengan spasi bukanlah masalah sebelumnya, tetapi saya menerapkan masukan Anda yang baik. Saya hanya perlu melakukan beberapa eksperimen untuk membuatnya berfungsi. Saya Saya telah mengedit pertanyaan dan semoga saya tidak menempelkan bug lain. Terima kasih atas komentar Anda, memalukan tetapi perlu.