我想在 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是一个python函数
答案1
sudo -i
作为目标用户运行登录 shell。其余部分export PS1...
只会在该 shell 终止后执行。
另外,您~/.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
定义和其余部分一样。不过,这是很多烦人的间接说法;我认为最好在远程配置文件中根据需要处理这些内容。