51

スクリプトを実行するたびに VirtualBox 共有フォルダーをマウントする小さなスクリプトを作成しようとしています。スクリプト作成のためにPythonを学習しようとしているので、Pythonでやりたいです。

問題は、マウント コマンドを起動する権限が必要なことです。スクリプトを sudo として実行することもできますが、自分で sudo を作成することをお勧めします。

パスワードを .py ファイルに書き込むのは安全ではないことは既に知っていますが、仮想マシンについて話しているのはまったく重要ではありません: .py スクリプトをクリックして動作させたいだけです。

これは私の試みです:

#!/usr/bin/env python
import subprocess

sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'

subprocess.Popen('sudo -S' , shell=True,stdout=subprocess.PIPE)
subprocess.Popen(sudoPassword , shell=True,stdout=subprocess.PIPE)
subprocess.Popen(command , shell=True,stdout=subprocess.PIPE)

私のpythonバージョンは2.6です

4

11 に答える 11

47
sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'
p = os.system('echo %s|sudo -S %s' % (sudoPassword, command))

これを試して、うまくいくかどうか教えてください。:-)

そしてこれ:

os.popen("sudo -S %s"%(command), 'w').write('mypass')

于 2012-10-24T08:45:14.340 に答える
5
  • sudo コマンドで -S オプションを使用して、端末デバイスではなく「stdin」からパスワードを読み取るように指示します。

  • PIPE から stdin を読み取るように Popen に指示します。

  • メソッドを通信するための引数としてパスワードを使用して、プロセスの stdin PIPE にパスワードを送信します。パスワードの最後に改行文字「\n」を忘れずに追加してください。

sp = Popen(cmd , shell=True, stdin=PIPE)
out, err = sp.communicate(_user_pass+'\n')   
于 2014-12-19T20:03:48.413 に答える
4

subprocess.Popenプロセスを作成し、パイプなどを開きます。あなたがしていることは次のとおりです。

  • プロセスを開始するsudo -S
  • プロセスを開始するmypass
  • プロセスを開始するmount -t vboxsf myfolder /home/myuser/myfolder

これは明らかに機能しません。引数を Popen に渡す必要があります。ドキュメントを見ると、最初の引数が実際には引数のリストであることがわかります。

于 2012-10-24T08:45:13.570 に答える
2

これをpython 3.5に使用しました。サブプロセスモジュールを使用して実行しました。このようなパスワードの使用は非常に安全ではありません。

サブプロセスモジュールはコマンドを文字列のリストとして受け取るため、事前に split()を使用してリストを作成するか、後でリスト全体を渡します。詳細については、ドキュメントを参照してください。

#!/usr/bin/env python
import subprocess

sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'.split()

cmd1 = subprocess.Popen(['echo',sudoPassword], stdout=subprocess.PIPE)
cmd2 = subprocess.Popen(['sudo','-S'] + command, stdin=cmd1.stdout, stdout=subprocess.PIPE)

output = cmd2.stdout.read.decode()
于 2018-04-05T10:28:15.120 に答える
1

sudoとして実行するものを制限するには、次を実行できます

python non_sudo_stuff.py
sudo -E python -c "import os; os.system('sudo echo 1')"

パスワードを保存する必要はありません。パラメータは、現在の-Eユーザーの環境をプロセスに渡します。シェルには 2 番目のコマンドの後に sudo 特権があることに注意してください。注意して使用してください。

于 2017-12-07T21:21:02.973 に答える
0

スクリプトで sudo パスワードをハードコーディングしないことが常に好ましいことはわかっています。ただし、何らかの理由で、ファイルの所有者を変更または変更する権限がない場合は/etc/sudoers、Pexpect が実行可能な代替手段になります。

参照用の Python 関数を次に示しsudo_execます。

import platform, os, logging
import subprocess, pexpect

log = logging.getLogger(__name__)

def sudo_exec(cmdline, passwd):
    osname = platform.system()
    if osname == 'Linux':
        prompt = r'\[sudo\] password for %s: ' % os.environ['USER']
    elif osname == 'Darwin':
        prompt = 'Password:'
    else:
        assert False, osname

    child = pexpect.spawn(cmdline)
    idx = child.expect([prompt, pexpect.EOF], 3)
    if idx == 0: # if prompted for the sudo password
        log.debug('sudo password was asked.')
        child.sendline(passwd)
        child.expect(pexpect.EOF)
return child.before
于 2014-09-29T09:38:35.047 に答える