3 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
在SSHClient.exec_command默認(rèn)情況下不分配會(huì)話的偽終端。結(jié)果是(可能)獲得了一組不同的啟動(dòng)腳本(特別是對(duì)于非交互式會(huì)話,.bash_profile則沒(méi)有獲得)。基于缺少/存在TERM環(huán)境變量,在腳本中采用和/或采用不同的分支。
要使用來(lái)模擬默認(rèn)的Paramiko行為ssh,請(qǐng)使用-T開(kāi)關(guān):
ssh -T myuser@host
見(jiàn)ssh男人:
-T 禁用偽tty分配。
相反,要ssh使用Paramiko 模擬默認(rèn)行為,請(qǐng)將的get_pty參數(shù)設(shè)置exec_command為True:
def exec_command(self, command, bufsize=-1, timeout=None, get_pty=False):
盡管不要通過(guò)在Paramiko中分配偽終端來(lái)解決此問(wèn)題,但最好將啟動(dòng)腳本設(shè)置為PATH對(duì)所有會(huì)話都設(shè)置相同。
為此,請(qǐng)參見(jiàn)使用Python Paramiko exec_command執(zhí)行某些Unix命令會(huì)失敗,并顯示“ <command> not found”。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
使用Channel對(duì)象而不是SSHClient對(duì)象解決了我的問(wèn)題。
chan=ssh.invoke_shell()
chan.send('echo $PATH\n')
print (chan.recv(1024))
有關(guān)更多詳細(xì)信息,請(qǐng)參見(jiàn)文檔

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
盡管這確實(shí)有幫助,但答案無(wú)法解釋原因。Channel
與vs. 無(wú)關(guān)SSHClient
。在SSHClient
使用Channel
內(nèi)部。不同之處在于您的原始代碼使用“ exec”通道,默認(rèn)情況下不分配偽終端。新代碼使用“外殼”通道時(shí),默認(rèn)情況下會(huì)分配一個(gè)偽終端。使用shell執(zhí)行命令不是一個(gè)好習(xí)慣。同樣,將帳戶配置為PATH
對(duì)交互式和非交互式終端使用不同的帳戶通常是一個(gè)不好的做法。
添加回答
舉報(bào)