我正在尝试使用 cronjob 在我的 EC2 实例上运行 shell 脚本,通过 SSH 连接到服务器以获取数据库的 mongodump 并在特定的时间进行恢复,而无需我登录。
我已经ssh-复制-idid_rsa 也是如此。
因此经过一些研究,这是我更新的 shell 脚本(出于隐私原因,使用了虚假主机)
auth=`find /tmp -user $LOGNAME -type s -name "*agent*" -print 2>/dev/null`
SSH_AUTH_SOCK=$auth
export SSH_AUTH_SOCK
rm -rf tmp
mkdir tmp
ssh [email protected] '
rm -rf tmp
mongodump --host=$PRODUCTION_DB_HOST --forceTableScan --username=$PRODUCTION_DBALL_USER2 --password=$PRODUCTION_DB_KEY --db=api_products_udm --ssl --authenticationDatabase admin --out=tmp
tar -cjf - tmp
' | tar xvjf - -C tmp
mongorestore tmp/tmp --drop
使用这个,只要我登录到 EC2 实例服务器,cronjob 就能完美运行,但是一旦我注销或会话终止,它就不会运行。 理想情况下,我希望这个 cron 作业能够运行,而不需要我每次在指定时间之前登录
有人能给我一些指导来实现这一点吗?我对 Linux 世界有点陌生:)
这是我的 crontab -e
0 10 * * * sh /home/ec2-user/productsrestore.sh
答案1
auth=`find /tmp -user $LOGNAME -type s -name "*agent*" -print >/dev/null` SSH_AUTH_SOCK=$auth export SSH_AUTH_SOCK
看起来您依赖转发的 ssh-agent 连接来获取私钥/密码。这似乎就是导致您在批处理作业运行之前必须保持交互式登录会话打开或建立会话的原因。
如何避免这种依赖?
通常,人们会设置一个专用的 ssh 密钥对(没有密码)供批处理作业使用。
你指示批处理作业使用该特定私钥ssh -i /path/to/id_rsa.batch ...
与往常一样,您复制公钥并将其添加到远程˜/.ssh/authorized_keys
,但为了安全起见,您可以使用经常被忽略的选项字段来对使用该特定密钥对进行身份验证的连接所允许的内容添加限制。
添加例如限制:、、no-port-forwarding
no-X11-forwarding
和/或其他。no-agent-forwarding
no-pty
from=IP-address
请参阅authorized_keys文件格式描述https://www.freebsd.org/cgi/man.cgi?sshd(8)因为它们的意义
cat ~/.ssh/authorized_keys
from=10.9.8.7 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB... comments start here
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDE... other comment