我正在尝试编写一个脚本,用于打开通向面向公众的服务器的 SSH 隧道。我已经编写了所有内容并正常运行,但连接似乎无法连接到我的服务器。日志显示以下内容:
Jun 8 21:00:01 <hostname> CRON[xxxx]: session opened for user <user> by (uid=0)
Jun 8 21:00:01 <hostname> CRON[xxxx]: session closed for user <user>
一遍又一遍,中间间隔 0-1 秒。我希望此连接处于打开状态....我怎样才能保持此连接处于打开状态?
我的 cron 代码如下所示(是的,我知道它每分钟都在运行):
* * * * * /bin/bash /home/<user>/ssh
我的入住代码是:
sshpass -p <password> ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null <user>@<url> -p <port> -R222<random_number>:localhost:22
那么,我该如何保持此连接打开?我有一个机制可以在另一个脚本中的适当时间将其终止,但除非我从命令行手动运行上述命令,否则 cron 会立即将其终止。
答案1
您的 crontab 脚本中有几个错误。
导致断开连接的原因是脚本不仅需要执行权限,还需要设置 suid 位(sudo chmod 4755 /pah/to/script)如果您正在使用 root 身份执行 shell 脚本。
crontab 环境与用户环境有很大不同。因此,始终需要使用完整路径命令:
/usr/bin/sshpass -p <password> /usr/bin/ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null <user>@<url> -p <port> -R222<random_number>:localhost:22
你应该添加标志-t -t到远程控制命令(是的,两次),因为这可以抑制无法分配 tty 的错误。
虽然我确信之前的错误,但有一个可能造成麻烦,我不确定,也没有时间去尝试:你有两个-p您的命令中有很多标志,我不确定它们是否被 shell 正确解释。如果我是你,我会将远程控制命令及其所有选项,放在单引号或双引号内,只是为了尝试。
如果您使用加密密钥,则可以避免前面提到的反对意见和使用公开密码,在这种情况下,您可以添加到您的.ssh/配置归档以下几行:
Host ShortName
HostName The.Full.HostName.com
User yourname
Port your-non-standard-port
IdentityFile /path/to/crypto/keyù
IdentitiesOnly yes
然后一行代码就变成了
/usr/bin/ssh -t -t -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -R222<random_number>:localhost:22 ServerName