从shell脚本尝试freebsd-update时如何伪装成tty?

时间:2012-05-10 03:40:34

标签: shell freebsd

我们通常使用自定义脚本在系统安装后设置新的FreeBSD机器,它从端口树安装工具并设置系统环境。 我们还需要通过freebsd-update自动将新安装的FreeBSD-8.2机器更新到FreeBSD-8.2p3。据我所知,freebsd-update不允许我在没有“cron”选项的情况下从shell脚本执行它。所以我尝试预加载一个自定义程序来欺骗freebsd-update:

${CAT} > /tmp/isatty.c     <<EOF                                                                                                                                                                                         
int isatty(const int fd) { return 1; }                                                                                                                                                                               
EOF                                                                                                                                                                                                                  
${CC} -shared -fPIC -o /tmp/isatty.so     /tmp/isatty.c                                                                                                                                                                          
${ENV} LD_PRELOAD=/tmp/isatty.so LESS="-E" ${FREEBSD_UPDATE} fetch install < /dev/null   

通过这个调整,我可以成功地从我的自定义脚本运行freebsd-update,但是在freebsd-installer从更新服务器获取文件之后,我收到了以下错误消息:

Fetching metadata signature for 8.3-RELEASE from update5.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... gunzip: standard input is a terminal -- ignoring
metadata is corrupt.

我有机会解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您设置的LD_PRELOAD也将被freebsd-update产生的任何和所有进程选中。更好的解决方案是创建一个freebsd-update的修改版本,允许您从命令行运行它而无需用户交互。

答案 1 :(得分:0)

此实用程序可能是您所需要的:empty - run processes and applications under pseudo-terminal (PTY)

这样你就可以从脚本启动freebsd-update了。