2017-05-27 62 views
3

现在我已经把我的头发拉出了几个小时。我欢迎任何关于下一步的新想法。crond不同的ssh行为

目标是通过SSH登录到自定义应用程序CLI,然后使用其中一个自定义CLI命令在远端设备上下载调试shell。在客户端,我使用CentOS的最小运行SSH如下:

工作情况:

[[email protected] ws]$ ssh -p8222 [email protected] 

[email protected]'s password: 
Welcome to CLI 
admin connected from 172.29.33.108 using ssh on scm2 
TRAN39# debug-utils shell 
[email protected]:~$ 

ssh客户端会话中使用的专用端口8222一旦CLI内访问定制CLI ,我们使用'debug-utils shell'命令来下载到bash shell。

这个序列是用Python/pexpect编写的脚本,当脚本从用户的命令行启动时工作正常。当脚本移动到crontab以由crond自动运行时,问题就出现了。在后一种情况下,脚本以一种奇怪的方式失败。

按照这篇文章的建议:How to simulate the environment cron executes a script with?我在客户端计算机上启动了一个新的shell,其环境变量与cron作业使用的相同,并且我能够手动重现与自动cron作业相同的问题。

使用cron环境设定,远端设备现在抛​​出下面的错误在哪里,我们发出命令拖放到该设备的bash shell中的点:

sh-4.2$ ssh -p8222 [email protected] 

[email protected]'s password: 
Welcome to CLI 
admin connected from 172.29.33.108 using ssh on scm2 
TRAN39# debug-utils shell 
error: failed to decode arguments 
TRAN39# 

有一次,我的问题重现,我设置了两个终端,一个使用工作环境变量,另一个使用失败的环境变量。我用`-vvv'标志从两个终端运行ssh,并比较两者之间的调试输出。

这两个输出是相同的,除了它们逐步通过环境变量以确定发送到SSH服务器(显然)要发送的内容以及“比特集”行稍有不同之外。我查看了环境变量行,我可以看到ssh忽略了所有这些,除了在工作案例和失败案例中都相同的LANG。

为什么远端设备的ssh服务器在这两个客户端环境设置之间的行为不同,我现在处于亏损状态。

这里的工作环境:

[[email protected]_vm ws]$ env 
XDG_SESSION_ID=294 
HOSTNAME=centos_vm 
SELINUX_ROLE_REQUESTED= 
TERM=xterm-256color 
SHELL=/bin/bash 
HISTSIZE=1000 
SSH_CLIENT=192.168.56.20 52795 22 
SELINUX_USE_CURRENT_RANGE= 
OLDPWD=/home/user 
SSH_TTY=/dev/pts/4 
USER=user 
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45: 
MAIL=/var/spool/mail/user 
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin 
PWD=/home/user/ws 
LANG=en_US.UTF-8 
SELINUX_LEVEL_REQUESTED= 
HISTCONTROL=ignoredups 
SHLVL=1 
HOME=/home/user 
LOGNAME=user 
SSH_CONNECTION=192.168.56.20 52795 192.168.56.101 22 
LESSOPEN=||/usr/bin/lesspipe.sh %s 
XDG_RUNTIME_DIR=/run/user/1000 
_=/usr/bin/env 
[[email protected]_vm ws]$ 

...这里是失败的(即的cron)环境:

sh-4.2$ env 
XDG_SESSION_ID=321 
SHELL=/bin/sh 
USER=user 
PATH=/usr/bin:/bin 
PWD=/home/user/ws 
LANG=en_US.UTF-8 
HOME=/home/user 
SHLVL=2 
LOGNAME=user 
XDG_RUNTIME_DIR=/run/user/1000 
_=/usr/bin/env 
OLDPWD=/home/user 
sh-4.2$ 

我在SSH的调试运行了我的深度这一点,所以任何指导下一步看什么非常赞赏。

+0

不知道这是否是您的问题,但我会在由cron运行的脚本/程序中设置PATH。 – Deathgrip

+0

我很确定我已经尝试过了,但我会再试一次并确认回来。 – Denis

+0

正如我所想,这并没有什么区别。 (还是)感谢你的建议。 – Denis

回答

1

通常ssh没有指定命令(ssh [email protected])会将本地主机上的TERM的值传递给远程服务器。例如:

# TERM=foo ssh 127.0.0.1 
bash-4.4# echo $TERM 
foo 
bash-4.4# 

在crontab中,crond默认将不设置TERM VAR所以ssh登录之后,TERM将被设置为dumb(这不是完全功能性的)。见例如:

# (unset TERM; ssh 127.0.0.1) 
bash-4.4# echo $TERM 
dumb 
bash-4.4# clear 
TERM environment variable not set. 
bash-4.4# 

在你的情况下,它听起来就像远程应用程序需要更多的功能TERM如此明确地将其设置为TERM=xterm(这将被传递到远程服务器)在crontab中会解决它。

注意ssh与命令(ssh [email protected] command...)将不分配远程服务器上的PTY所以本地TERM不会被通过。要强制创建一个pty并传递该var,我们必须使用ssh -t。见例如:上Wikipedia

# echo $TERM 
dtterm 
# ssh 127.0.0.1 'tty; echo $TERM' 
not a tty 
dumb 
# ssh -t 127.0.0.1 'tty; echo $TERM' 
/dev/pts/8 
dtterm 
# 

实测值哑终端

哑终端是那些可以解释的有限数的控制代码(CRLF等)但无法处理执行诸如清除行,清除屏幕或控制光标位置等功能的特殊转义序列。在这种情况下,愚蠢的终端有时被称为玻璃Teletypes,因为它们基本上具有与机械电传类型相同的有限功能。通过将环境变量TERM设置为dumb,现代类Unix系统仍支持这种类型的哑终端。智能或智能终端是那些也能够处理转义序列的终端,特别是VT52VT100ANSI转义序列。

+0

感谢您的解决方案。它的工作方式类似于传递给crontab调用的TERM = term的魅力。 – Denis