У меня есть что-то вроде этого в моем служебном приложении системного трея, написанном на Go для случаев if os.GOOS == "darwin":
a := "'do shell script \""
b := "\" with administrator privileges'"
// I have also tried:
//
// a := "'do shell script `"
// and
// b :="` with administrator privileges'"
c := "echo -e something >> someFileThatNeedsSudo.conf && ./launchAdminProgram && ....' with administrator privileges'"
d = a + b + c
// d is then = "'do shell script \"echo -e something >> someFileThatNeedsSudo.conf && ./launchAdminProgram && .... ' with administrator privileges'"
cmd := exec.Command("/usr/bin/osascript", "-e", d)
// Omitting my error handling since there's no output and irrelevant
fmt.Println(cmd)
cmd.Run()
Моя обработка ошибок ловит ошибки, которые показывают выходстатус 1 вместе с ошибкой, и я уже исправил все эти ошибки. Теперь, кажется, он работает без ошибок, а затем (возможно) застревает при запросе пароля пользователя, который не появляется в графическом интерфейсе. Если я посмотрю на вывод fmt.Println (cmd) из вышеприведенного, я получу это:
/usr/bin/osascript -e 'do shell script "echo -e something >> someFileThatNeedsSudo.conf && ./launchAdminProgram && ...." with administrator privileges'
, если я скопирую и вставлю выше в терминале, появится логин GUI, я наберувведите пароль, и все будет работать, как и ожидалось.
Я довольно долго искал и не нашел каких-либо указаний на то, почему это происходит.
Я на Высшей Сьерре, и последняя версия Go from homebrew (go1.13.3 darwin / amd64).