Заставьте Python ввести пароль при запущении csh скрипта

Может быть, это поможет вам.

package main

import (
    "fmt"
    "github.com/stretchr/testify/mock"
)

type userReader interface {
    ReadUserInfo(int) int
}

type userWriter interface {
    WriteUserInfo(int)
}

type UserRepository struct {
    userReader
    userWriter
}

type realRW struct{}

func (db *realRW) ReadUserInfo(i int) int {
    return i
}

func (db *realRW) WriteUserInfo(i int) {
    fmt.Printf("put %d to db.\n", i)
}

// this is mocked struct for test writer.
type MyMockedWriter struct {
    mock.Mock
}

func (m *MyMockedWriter) ReadUserInfo(i int) int {

    args := m.Called(i)
    return args.Int(0)

}

func main() {
    rw := &realRW{}
    repo := UserRepository{
        userReader: rw,
        userWriter: rw,
    }
    fmt.Println("Userinfo is:", repo.ReadUserInfo(100))
    repo.WriteUserInfo(100)

    // when you want to write test.
    fmt.Println("Begin test....................")
    testObj := new(MyMockedWriter)
    testObj.On("ReadUserInfo", 123).Return(250)

    testRepo := UserRepository{
        userReader: testObj,
        userWriter: rw,
    }
    fmt.Println("Userinfo is:", testRepo.ReadUserInfo(123))
    testRepo.WriteUserInfo(100)
}

// Output:
// Userinfo is: 100
// put 100 to db.
// Begin test....................
// Userinfo is: 250
// put 100 to db.

Удачи.

5
задан darrickc 23 October 2008 в 18:22
поделиться

7 ответов

Взгляните на pexpect модуль. Это разработано для контакта с интерактивными программами, который, кажется, случай.

О, и помните, что пароль трудно кодирующего корня в оболочке или сценарии Python является потенциально дырой в системе безопасности :D

7
ответ дан 18 December 2019 в 14:53
поделиться

Используйте подпроцесс. Назовите Popen () для создания процесса, и использование связываются (), чтобы отправить ему текст. Извините, забыл включать КАНАЛ..

from subprocess import Popen, PIPE

proc = Popen(['server', 'stop'], stdin=PIPE)

proc.communicate('password')

Вы добились бы большего успеха, действительно избегают пароля и пробуют схему как sudo и sudoers. Pexpect, упомянутый в другом месте, не является частью стандартной библиотеки.

4
ответ дан 18 December 2019 в 14:53
поделиться

Это, кажется, работает лучше:

import popen2

(stdout, stdin) = popen2.popen2('server stop')

stdin.write("password")

Но это еще не 100%. Даже при том, что "пароль" является правильным паролем, я все еще получаю su: Извините назад из csh сценария, когда это пытается к su базироваться.

0
ответ дан 18 December 2019 в 14:53
поделиться

Должен смочь передать его в качестве параметра. что-то как:

commands.getoutput('server stop -p password')
0
ответ дан 18 December 2019 в 14:53
поделиться
import pexpect
child = pexpect.spawn('server stop')
child.expect_exact('Password:')

child.sendline('password')

print "Stopping the servers..."

index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60)
child.expect(pexpect.EOF)

Добился цели! Правила Pexpect!

1
ответ дан 18 December 2019 в 14:53
поделиться

Чтобы избежать необходимости отвечать на вопрос Пароля в сценарии Python, я просто собираюсь запустить скрипт как корень. Этот вопрос является все еще оставшимся без ответа, но я предполагаю, что просто сделаю это этот путь на данный момент.

0
ответ дан 18 December 2019 в 14:53
поделиться

Добавьте input = в proc.communicate () , чтобы парни, которые любят использовать стандартную библиотеку lib.

from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate(input='password')
1
ответ дан 18 December 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: