Crontab履行脚本中的ssh指令拜访被回绝51CTO博客 - 凯时娱乐

Crontab履行脚本中的ssh指令拜访被回绝51CTO博客

2019年03月10日10时35分36秒 | 作者: 惜梦 | 标签: 脚本,履行,指令 | 浏览: 1191

咱们常常会经过crontab来履行守时使命,一般出产环境中在不同主机直接进行登录是经过ssh来衔接的。比方咱们经过在备份服务器上设定守时使命,守时经过scp(运用SSH的长途复制指令)来复制长途服务器的数据到备份服务器上,这也是我遇到的一个工作。


环境描绘:


脚本与守时使命:

守时使命设置如下:

不管是否履行成功,都把信息输出到2222.txt中

脚本内容如下:

我这儿仅用ssh指令来测验,实际上这个指令假如能够正常履行的话,你履行scp指令也相同

#!/bin/bash
ssh -v 192.168.50.135 ls


报错信息:

下图是crontab履行守时使命中的脚本的报错信息

你发现TCP衔接是成功树立的,然后也在备份服务器上的~/.ssh/目录中的known_hosts文件中找到了host key。这个key是对方主机的公钥。在/etc/ssh/ssh_config中的 StrictHostKeyChecking 的值决议了是否把对方的公钥放在known_hosts文件中。假如是yes则表明不寄存,假如是no则表明寄存,假如是ask则表明问询。

下图这个意思是说KEY找到了并且匹配,就是说备份服务器存的对方服务器的公钥和对方现在运用的公钥共同。

最终是测验发送自己运用的公钥让对方去验证,这儿测验了几回,并且更换了几种验证方法均宣告失利,所以最终回绝拜访。

下图是单纯运转脚本的输出信息:也就是直接在终端中运转脚本

能够看到验证是经过的,不过你会发现它运用的是一个叫做id_dsa的公钥文件发送给服务器,然后对方承受了。但是我这个备份服务器本地的~/.ssh/目录中并没有id_dsa的文件


我发现跳板机(Linux的跳板机,一般登录IDC的机器都要登录到跳板机,并且其他服务器也只承受来自跳板机的IP信息,你就算拨入了***,假如不先衔接到跳板机,你也是无法登录服务器的,那或许有人问,我经过跳板机衔接到了服务器,然后从这个服务器再SSH到别的的服务器是否能够呢?能够)的~/.ssh/目录中有id_dsa文件,所以我就复制到我的备份服务器上,测验后仍然失利。


排查问题:


检查env


修正脚本:

修正~/.bashrc文件,也就是本地变量文件,在文件中添加如下内容,这些内容和也就是之前经过env检查到的

export SSH_CLIENT="192.168.90.58 14567 1314"
export SSH_TTY=/dev/pts/2
export SSH_AUTH_SOCK=/tmp/ssh-cvRpw15068/agent.15068
export SSH_CONNECTION="192.168.90.58 14567 192.168.90.91 1314"


修正脚本

#!/bin/bash
source $HOME/.bashrc
ssh -v 192.168.50.135 ls


验证:

再次履行就成功了。


总结:

crontab履行脚本不成功一般都是环境变量导致的,由于crontab履行脚本归于非登式shell,针对这种它是不加载/etc/profiel和~/.bash_profile。它的会先加载~/.bashrc,然后加载/etc/bashrc,最终加载/etc/profile.d/下的变量。所以我在家目录中的bashrc中设置了和env中相同的变量,这样在脚本里边指定就能够了。假如你只是在basrc中写,而不在脚本中source初始化文件也不可。原因我猜想或许是跟crontab自己的环境变量有关,并且在/etc/rond的配置文件中设置环境变量不收效,不知道为什么。


所以在crontab履行脚本,一般的主张是指令写全途径,别的还应该设置好环境变量

#!/bin/bash
source /etc/profile
source $HOME/.bashrc

假如是ssh这种长途履行,能够运用-i参数指定公钥。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章