Jenkins-agent не может в pty. Это факт. И он происходит из того, что при создании субпроцесса (shell, pipeline, и т.д.), ему не создаётся pty. Потому что не нужно никогда и никому.
Но, есть expect ("ВНЕЗАПНО!"). И вот именно ему pty очень даже нужен. И если pty/pts/tty для expect нет, то при попытке общения с терминалом (например, через spawn) expect вываливается с ошибкой вида send spawn id exp0 not open . А так как expect нежно любим в отдельных местах, то перед devopsом встаёт призрак заката солнца в ручную. Что неправильно.
Однако, есть pty.h в котором есть функция openpty. Но, так как таскать с собой пристяжной к jenkins pipeline бинарь (или, что исчио хужее таво) компилить его jit не самая хорошая идея, то есть такой вариант для python3:
- тривиальный вариант: python3 -c 'import pty; pty.spawn("tty") , вывод будет на stdout родителя, но с лишними переводами строк в логе jenkins.
- чуть менее тривиально: python3 -c 'import pty; import subprocess; (pM,pS) = pty.openpty(); subprocess.run("tty".split(), stdin=pM, stdout=pS, shell=False) , причём если опустить stdout=pS, то вывод будет на stdout родителя.
- для Ъ-джедаев: python3 -c 'import pty; import subprocess; (pM,pS) = pty.openpty(); subprocess.run("tty | tee -a /tmp/istty.log", stdin=pM, stdout=pS, shell=True)