2016-03-09 160 views
2

我正在使用名爲「paramiko」的python SSH庫。 它使用這樣的:爲什麼paramiko將 r n換成換行符而不是 n?

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect(host, username=user_name, password=password) 
chan = ssh_pool[host].get_transport().open_session() 
chan.exec_command(SOME_COMMAND) 

因爲我需要在須藤執行一些命令,我​​需要調用chan.get_pty()exec_command,以確保此之前還有一個TTY avaliable。

我在調用get_pty()之後發現,stdout從遠程服務器返回時使用\ r \ n作爲換行符而不是\ n。

例如:

>>> chan = ssh.get_transport().open_session() 
>>> chan.exec_command("echo hello world") 
>>> chan.recv(1000) 
b'hello world\n' 

,並呼籲get_pty()後:

>>> chan = ssh.get_transport().open_session() 
>>> chan.get_pty() 
>>> chan.exec_command("echo hello world") 
>>> chan.recv(1000) 
b'hello world\r\n' 

我有做一些網絡搜索,但找不到任何連接到PTY/TTY /換行/ \ r \ n

我很擔心什麼可能會導致此更改。

爲什麼paramiko將\ r \ n作爲換行符返回而不是\ n?

+0

你爲什麼這麼擔心?這只是您正在運行的命令的返回值字符串的換行符。當然,你需要以某種方式進行處理,但是要麼將其拆分成'\ n'列表並替換'\ r'或替換'\ r'和'\ n':http:// stackoverflow。com/questions/16566268 /從一長串文本中刪除所有行中斷 –

+0

@JensHöpken因爲我正在處理一堆具有完全不同環境的服務器。我想到的只是處理\ r \ n和\ n。但是我仍然擔心,如果我無法弄清楚可能會導致這種情況,有一天會出現某種未知的問題。 –

回答

2

因爲這就是換行符(僞)終端的換行符。 \r是將光標移動到第1列的回車,\n是將光標向下移動一個的換行。

終端默認啓用了onlcr轉換標誌。從stty手冊頁:

[-]onlcr

換行進行回車

你也可以看到這個標記啓用,即沒有-在前面(第3最後一行)在輸出stty -a

% stty -a 
speed 38400 baud; rows 46; columns 79; line = 0; 
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; 
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; 
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; 
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts 
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff 
-iuclc -ixany -imaxbel iutf8 
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt 
echoctl echoke 

您可以stty -onlcr禁用此設置,但它的存在一般不應成問題;如果您懷疑某些二進制數據可能會被破壞,那麼您不能使用任何pty。


如果這只是一些簡單的命令,那麼它不會增加太多,你通過SSH發送您的明文密碼的安全性;如果任何人現在都可以訪問遠程帳戶,他們不僅可以無限制地訪問該計算機上的root用戶,還可以知道您的密碼。這是更好讓SSH爲根,並讓根用"forced commands"edit /etc/sudoers so that no password is required for this single command from this account運行這1命令。

+0

謝謝你的回答和建議!我會嘗試。 –

相關問題