Apakah ada cara untuk meniru perintah "Sudo su - user_name" dan kemudian menjalankan perintah yang saya butuhkan?
Mencoba run
dan sudo
dan sayangnya tidak ada cara untuk membuatnya. Tolong bantu
Apakah '-' penting dalam apa yang Anda coba lakukan? (mis. memanggil login) atau apakah Anda hanya mencoba menjalankan perintah sebagai pengguna lain selain pengguna dan root saat ini?
Jika pengaruh login tidak penting maka Anda dapat melakukan hal berikut ...
sudo("mkdir /var/www/new_docroot", user="www-data")
atau
with settings(sudo_user='mysql'):
sudo("whoami") # prints 'mysql'
atau jika login itu penting (cara hacky) Anda bisa melakukan ini, saya kira ...
sudo("su - usernaeme -c 'command to be run'")
Ya - penting bagi saya. Saya perlu menerapkan
Harap perhatikan bahwa saya hanya memiliki kata sandi akun saya dan saya tidak memiliki kata sandi untuk pengguna tersebut di langkah 2 oleh karena itu saya harus terhubung melalui
sudo su - user_name
Sayangnya, saya tidak dapat menggunakannya karena dilarang karena izin saya
sudo("su - usernaeme -c 'command to be run'")
Sorry, user user_name is not allowed to execute '/usr/bin/su - another_user -c pwd' as root on server.
Ada saran lain?
@polusok : Sudahkah Anda menemukan solusi? Saya memiliki masalah yang sama. Saya hanya dapat menggunakan sudo su - jboss
untuk menjadi pengguna jboss.
@polusok @kusnier Saya bekerja dengan batasan serupa. Anda dapat mencoba meneruskan perintah Anda dengan cara ini.
run('echo "whoami" | sudo su - nama pengguna')
npalrecha, itu tampaknya berfungsi tetapi meminta kata sandi pada setiap perintah. Apakah benar-benar tidak ada cara untuk hanya Sudo su - pengguna dan menjalankan semua perintah berikutnya sebagai pengguna itu?
Saya memiliki masalah yang sama... Jika Anda dapat mengubah file /etc/sudoers
, itu mungkin solusi termudah. Baris Anda mungkin terbaca username host = ALL
tetapi seharusnya terbaca username host = (ALL) ALL
.
Inilah solusi saya untuk mereka yang tidak bisa.
Perhatikan bahwa melakukan sudo(command, user="otheruser")
dengan solusi ini tidak akan berhasil.
class Sudosu:
def __init__(self, user):
self.user = user
def __enter__(self):
self.old_sudo_prefix = env.sudo_prefix
self.old_sudo_user, env.sudo_user = env.sudo_user, self.user
env.sudo_prefix = "sudo -S -p '%(sudo_prompt)s' su - %(sudo_user)s -c"
def __exit__(self, a, b, c):
env.sudo_prefix = self.old_sudo_prefix
env.sudo_user = self.old_sudo_user
Gunakan seperti itu...
<strong i="17">@task</strong>
def test():
with Sudosu(user=username):
sudo("whoami")
Atau, sebagai dekorator ...
def sudosu(user):
def wrap(f):
def inner(*args, **kwargs):
old_sudo_prefix = env.sudo_prefix
old_sudo_user, env.sudo_user = env.sudo_user, user
env.sudo_prefix = "sudo -S -p '%(sudo_prompt)s' su - %(sudo_user)s -c"
f(*args, **kwargs)
env.sudo_prefix = old_sudo_prefix
env.sudo_user = old_sudo_user
inner.__name__ = f.__name__
return inner
return wrap
Gunakan seperti itu...
<strong i="24">@task</strong>
@sudosu("username")
def whoami():
sudo("whoami")
atau...
sudo = sudosu("username")(sudo)
<strong i="28">@task</strong>
def whoami():
sudo("whoami")
Apapun cara Anda merasa seperti. Preferensi saya adalah sebagai konteksnya.
Tentu saja, Anda dapat mengatur env.sudo_prefix
, tetapi Anda perlu mengatur ulang jika ingin melakukan sudo normal.
Juchiu, saya memiliki harapan yang tinggi tetapi itu tidak berhasil untuk saya. Saya pada dasarnya mendapatkan kesalahan yang sama yang diberikan oleh fabric saja. Saya menggunakan Red Hat Enterprise Linux Server rilis 5.4 (Tikanga). Solusi Npalrecha berfungsi, tentu saja tidak elegan.
Kesalahan:
Maaf, pengguna xxxx tidak diizinkan untuk mengeksekusi '/bin/su - yyyy -c -u
yyyy /bin/bash -l -c whoami' sebagai root di server saya.com.com.
Dieksekusi: sudo -S -p 'kata sandi sudo:' su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"
Sepertinya masih mencoba meneruskan -u yyyy
ke Sudo. Saya percaya bahwa ketika Anda melakukan panggilan sudo()
, Anda masih memasukkan user
sebagai kwarg.
Tetapi pesan kesalahan Anda menarik, karena sepertinya Anda mungkin tidak diizinkan di Sudo untuk mengeksekusi su dengan argumen tertentu, terutama karena Anda diizinkan untuk sudo su - yyyy
secara normal.
FWIW, argumennya sepertinya tidak masuk akal bagi saya, tetapi saya menemukan apa yang aneh.
Sudo tampaknya telah mencoba menjalankan perintah su - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"
. Su kemudian tampaknya mencoba mengeksekusi -u "achuser" /bin/bash -l -c "whoami"
, tetapi hanya menjalankan whoami
karena dianggap -c dilewatkan beberapa kali, dan hanya membutuhkan yang terakhir. Saya mungkin akan mencoba untuk menghindari hal ini terjadi.
Ini lebih merupakan makanan milis daripada masalah sebenarnya dengan kain - akan ditutup seperti itu.
Komentar yang paling membantu
@polusok @kusnier Saya bekerja dengan batasan serupa. Anda dapat mencoba meneruskan perintah Anda dengan cara ini.
run('echo "whoami" | sudo su - nama pengguna')