「sudosu--user_name」コマンドを模倣して、必要なコマンドを実行する方法はありますか?
run
とsudo
を試しましたが、残念ながらそれを行う方法はありません。 助けてください
'-'はあなたがやろうとしていることにおいて重要ですか? (例:ログインを呼び出す)または、現在のユーザーとルート以外の別のユーザーとしてコマンドを実行しようとしていますか?
ログインの影響が重要でない場合は、次のようにすることができます...
sudo("mkdir /var/www/new_docroot", user="www-data")
また
with settings(sudo_user='mysql'):
sudo("whoami") # prints 'mysql'
または、ログインが重要な場合(ハッキーな方法)、これを行うことができます...
sudo("su - usernaeme -c 'command to be run'")
はい-私にとって重要です。 実装する必要があります
私は自分のアカウントのパスワードしか持っておらず、ステップ2でそれらのユーザーのパスワードを持っていないため、を介して接続する必要があることに注意してください
sudo su - user_name
残念ながら、許可を得て禁止されているため使用できません
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.
他に何か提案はありますか?
@polusok :回避策はありますか? 私も同じ問題を抱えてる。 sudo su - jboss
を使用してjbossユーザーになることしかできません。
@polusok@ kusnier私は同様の制限で作業しています。 この方法でコマンドを渡すことができます。
run('echo "whoami" | sudo su --username')
npalrecha、これは機能しているように見えますが、各コマンドでパスワードの入力を求められます。 sudo su --userだけで、後続のすべてのコマンドをそのユーザーとして実行する方法は本当にありませんか?
同じ問題が発生しました... /etc/sudoers
ファイルを変更できる場合は、おそらくそれが最も簡単な解決策です。 あなたの行はおそらくusername host = ALL
と表示されますが、 username host = (ALL) ALL
と表示されるはずです。
これができない人のための私の回避策です。
これらのソリューションでsudo(command, user="otheruser")
を実行しても機能しないことに注意してください。
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
そのように使用してください...
<strong i="17">@task</strong>
def test():
with Sudosu(user=username):
sudo("whoami")
または、デコレータとして...
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
そのように使用してください...
<strong i="24">@task</strong>
@sudosu("username")
def whoami():
sudo("whoami")
また...
sudo = sudosu("username")(sudo)
<strong i="28">@task</strong>
def whoami():
sudo("whoami")
どちらの方法でも。 私の好みは文脈としてです。
もちろん、 env.sudo_prefix
を設定することもできますが、通常のsudoを実行する場合は、リセットする必要があります。
じゅちゅう、期待は高かったのですが、うまくいきませんでした。 基本的に、ファブリックだけで発生したのと同じエラーが発生します。 私はRedHatEnterprise Linux Serverリリース5.4(Tikanga)を使用しています。 Npalrechaのソリューションは機能しますが、もちろんエレガントではありません。
エラー:
申し訳ありませんが、ユーザーxxxxは'/ bin / su --yyyy-c-uの実行を許可されていません
myserver.com.comのrootとしてyyyy/bin / bash -l -cwhoami'。
実行:sudo -S -p'sudoパスワード:' su --yyyy -c -u "yyyy" / bin / bash -l -c "whoami"
まだ-u yyyy
をsudoに渡そうとしているようです。 あなたがsudo()
の電話をかけているとき、あなたはまだuser
をkwargとして渡していると私は信じています。
ただし、通常はsudo su - yyyy
が許可されているため、sudoで特定の引数を使用してsuを実行することは許可されていないように見えるため、エラーメッセージは興味深いものです。
FWIW、議論は私には意味をなさないようでしたが、私は何がおかしいのか理解しました。
須藤はコマンドsu - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"
を実行しようとしたようです。 その後、Suは-u "achuser" /bin/bash -l -c "whoami"
を実行しようとしているように見えますが、-cが複数回渡されたと見なし、最後の1つだけを取得するため、 whoami
のみを実行しています。 私はおそらくこれが起こらないようにしようと思います。
これは、ファブリックに関する実際の問題よりも多くのメーリングリストの飼料です-そのように閉じます。
最も参考になるコメント
@polusok@ kusnier私は同様の制限で作業しています。 この方法でコマンドを渡すことができます。
run('echo "whoami" | sudo su --username')