2016-03-09 5 views
2

Я использую python SSH-библиотеку с именем «paramiko». Он использует так:Почему 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 обеспечения есть терминал имеющийся.

И я нашел после того, как я вызвал 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' 

У меня есть сделать некоторые веб-поиска, но не может найти что-нибудь подключиться к псевдотерминал/TTY/перевод строки/\ г \ n

Я беспокоюсь о том, что может вызвать это изменение.

Почему paramiko возвращает \ r \ n как новую строку вместо \ n?

+0

Почему вы так беспокоитесь об этом? Это просто разрыв строки строки возвращаемого значения команды, которую вы запускаете. Конечно, вам нужно как-то это обработать, но разделите его на список на '\ n' и замените' \ r' или замените как '\ r', так и' \ n': http: // stackoverflow.com/questions/16566268/remove-all-line-breaks-from-a-long-string-of-text –

+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 root, и позвольте root запустить эту команду 1 с "forced commands", или edit /etc/sudoers so that no password is required for this single command from this account.

+0

Спасибо за ваш ответ и совет! Я попробую. –