微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 来自cronjob的“stdin:不是tty”

每次执行特定的cronjob时,我都会收到以下邮件.当我直接调用它时,调用的脚本运行正常,甚至来自cron.所以我得到的消息不是一个实际的错误,因为脚本完全按照它应该做的去做.

这是cron.d条目:

* *     * * *     root   /bin/bash -l -c "/opt/get.sh > /tmp/file"

和get.sh脚本本身:

#!/bin/sh

#group and url
groups="foo"

url="https://somehost.test/get.PHP?groups=${groups}"

# encryption
pass='bar'
method='aes-256-xts'
pass=$(echo -n $pass | xxd -ps | sed 's/[[:xdigit:]]\{2\}/&/g')

encrypted=$(wget -qO- ${url})
decoded=$(echo -n $encrypted | awk -F '#' '{print $1}')
iv=$(echo $encrypted | awk -F '#' '{print $2}' |base64 --decode | xxd -ps | sed 's/[[:xdigit:]]\{2\}/&/g')

# base64 decode input and save to file
output=$(echo -n $decoded | base64 --decode | openssl enc -${method} -d -nosalt -nopad -K ${pass} -iv ${iv})

if [ ! -z "${output}" ]; then
        echo "${output}"
else
        echo "Error while getting information"
fi

当我没有使用bash -l语法时,脚本会在wget过程中挂起.所以我的猜测是它与wget有关并将输出放到stdout.但我不知道如何解决它.

最佳答案
你实际上有两个问题.

>为什么打印stdin:不是tty?

此警告消息由bash -l打印. -l( – login)选项要求bash启动登录shell,例如:通常在您输入密码时启动的那个.在这种情况下,bash期望它的stdin是一个真正的终端(例如,isatty(0)调用应该返回1),如果它由cron运行则不是真的 – 因此这个警告.

重现此警告的另一种简单方法是非常常见的,即通过ssh运行此命令:

$ssh user@example.com 'bash -l -c "echo test"'
Password:
stdin: is not a tty
test

这是因为当使用命令作为参数调用时,ssh不会分配终端(在这种情况下,应该使用-t选项来强制终端分配).

>为什么没有-l它不起作用?

正如@Cyrus在评论中正确陈述的那样,在启动时加载bash的文件列表取决于会话的类型.例如.对于登录shell,它将加载/ etc / profile,〜/ .bash_profile,〜/ .bash_login和〜/ .profile(参见手动bash(1)中的INVOCATION),而对于非登录shell,它只会加载〜/. bashrc中.您似乎只在为登录shell加载的一个文件中定义了您的http_proxy变量,但在〜/ .bashrc中没有.你将它移动到〜/ .wgetrc它是正确的,但你也可以在〜/ .bashrc中定义它,它会工作.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐