SSH를 통해 다른 CentOS로 접속할 때 PS1을 변경하고 싶습니다.
strshell = 'PS1="remote!"'
os.system("ssh -i %s -l%s -p%s %s %s"%(SSH_KEY,SSH_USER,SSH_PORT,des,strshell))
SSH가 자동으로 종료됩니다. 나는 이 껍질 안에 머물고 싶다. 달성하는 방법.
방금 다른 방법으로 바꿨어요
tin = ' sudo -i ; export PS1="Remote! \W :"; exec /bin/bash -i'
os.system("ssh -i%s -l%s -p%s %s -t%s" % (SSH_KEY, SSH_USER, SSH_PORT, des, tin))
그런데 원격 컴퓨터 프롬프트 대신 로컬 컴퓨터 프롬프트를 변경했습니다. 왜?
os.system은 파이썬 함수입니다
답변1
sudo -i
대상 사용자로 로그인 쉘을 실행하십시오. 나머지는 export PS1...
쉘이 종료된 후에만 실행됩니다.
또한 ~/.bashrc
PS1을 재정의하여 환경에 전달할 수도 있는데 이는 도움이 되지 않을 수 있습니다.
당신은 시도 할 수 있습니다:
ssh -t host 'sudo env PROMPT_COMMAND="PS1=\"Remote! \W: \"
unset PROMPT_COMMAND" bash -l'
(대상 사용자가 ~/.bashrc
이것을 설정하지 않았다고 가정 $PROMPT_COMMAND
).
답변2
이것은 작동하는 것 같습니다:
ssh -t localhost "echo '. /dev/fd/2'|sudo bash -sil 2<<\FILE
PS1='my prompt : '
exec 2>/dev/tty
exec </dev/tty
FILE
"
[sudo] password for mikeserv:
my prompt : id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),19(log)
my prompt :
sudo
기본적으로 0,1,2를 제외한 모든 파일 설명자는 닫히고 <&0
터미널에 비밀번호가 필요하지만 일반적으로 하이재킹을 통해 몰래 지나갈 수 있습니다 stderr
. 어쨌든 영원히 사라진 것은 아닙니다. 사실 제가 위에서 가장 먼저 한 일은 ssh
터미널에 다시 연결하는 것이었습니다. 보다 현실적으로, $(cat file)
제가 $PS1
정의한 것과 나머지 부분 처럼 작업할 실제 스크립트가 몇 가지 있을 것입니다 . 하지만 이는 매우 귀찮은 간접적인 방법이므로 원격 구성 파일에서 필요에 따라 처리하는 것이 가장 좋습니다.