人们经常根据crontab来计划任务。在一般的工作环境下,登录不同的服务器是按照ssh连接的。比如大家按照备份数据服务器上设置的调度任务,按照scp(带SSH的远程控制复制指令)按时将远程控制服务器的数据信息复制到备份数据服务器上,这是我遇到的一件事。
自然环境描述:
脚本和计划任务:
任务设置如下:
无论实现成功与否,信息都会输出到2222.txt
脚本如下:
我在这里只使用ssh命令进行测试。事实上,如果这个命令可以正常执行,那么可以使用scp命令。
#!/bin/bash ssh -v 192.168.50.135 'ls'错误消息:
下图显示了crontab的实现规划任务中脚本的错误信息。
您发现TCP连接已成功创建,然后您在~/中的known_hosts文档中找到了主机密钥。备份数据服务器上的ssh/file目录。这个密钥是另一台服务器的公钥。/etc/ssh/ssh_config中StrictHostKeyChecking的值决定了是否将对方的公钥放在known_hosts文档中。如果有,表示没有存储;如果没有,表示存储;如果问,表示了解。
下图表示找到并匹配了密钥,即备份数据服务器中存储的对方服务器的公钥与对方服务器当前使用的公钥一致。
最终我尝试了推送自己申请的公钥让对方认证。我在这里试了几次,几种认证方式都宣告不成功,最后还是拒绝访问。
下图显示了简单 *** 作脚本的输出信息:即在终端设备中立即运行的脚本
你可以看到认证是基于的,但是你可以发现它使用一个名为id_dsa的公钥文档发送到服务器,然后对方接受。但是本地~/中没有id_dsa的文档。我的备份数据服务器的ssh/file目录
我找到了跳板机(Linux跳板机)。一般登录IDC的设备必须登录跳板机,其他服务器只接受跳板机的IP信息。即使拨入XXX,不先连接跳板机也无法登录服务器。很可能有人会问,我有没有可能按照跳板机连接服务器,然后从这个服务器SSH到其他服务器?~/中有id_dsa文档。可以的ssh/file目录),所以我把它复制到我的备份数据服务器上,检测后还是不成功。
库存问题:
查询环境
更改脚本:
更改~/。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/profile和~/中。bash_profile。它将加载~/。首先是bashrc,然后是/etc/bashrc,最后是/etc/profile.d/下的参数。因此,一个人在主文件目录中的bashrc中设置的参数与在env中设置的参数相同,因此在脚本中具体说明就足够了。如果只是用basrc写,脚本里没有源码重置文档,那就不好了。我猜可能和crontab本身的环境变量有关,在/etc/rond中设置环境变量是不行的。我不知道为什么。
因此,在crontab中实现脚本时,一般的建议是编写所有的指令,此外,还要设置环境变量。
#!/bin/bash source /etc/profile source $HOME/.bashrc如果实现了ssh之类的远程控制,可以应用-i主参数特定的公钥。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)