如何在只有极少可用命令的 Linux 机器上设置时区?

如何在只有极少可用命令的 Linux 机器上设置时区?

我有一台 Linux 机器,上面只有非常少的可用命令,例如如下/bin所示:

/bin# ls
ash            chattr         clockdiff      dd             dumpkmap       fdflush        gunzip         linux32        ls             mktemp         mt             pidof          printenv       rmdir          setserial      su             tracepath      umount         watch
busybox        chgrp          cp             df             echo           fgrep          gzip           linux64        lsattr         more           mv             ping           ps             run-parts      sh             sync           tracepath6     uname          zcat
cat            chmod          cpio           dmesg          egrep          getopt         hostname       ln             mkdir          mount          netstat        ping6          pwd            sed            sleep          tar            traceroute6    usleep
catv           chown          date           dnsdomainname  false          grep           kill           login          mknod          mountpoint     nice           pipe_progress  rm             setarch        stty           touch          true           vi

另外,它没有/usr/share/zoneinfo目录。

那么如何使用这些命令设置时区呢?我还需要从另一台主机远程同步时区和日期。

我尝试了TZenv 变量,但它不起作用,例如:

root@xxx:/bin# date
Wed Aug 31 12:02:41 UTC 2023
root@xxx:/bin# TZ=America/New_York date
Thu Aug 31 12:03:50 America 2023
root@xxx:/bin# date
Thu Aug 31 12:04:58 UTC 2023

请注意,设置 TZ 后时间不会改变。

答案1

如果您没有时区文件,您仍然可以通过在TZ变量中描述来指定时区(请参阅man tzset了解详情)。

最小形式是时区名称,后跟时区到 UTC 的偏移量;因此

TZ=CEST-2

中欧夏令时或

TZ=EDT4

东部夏令时。

不同时间偏移(冬季/夏季、夏令时等)之间的转换可以通过指定两个偏移及其更改的日期来描述;man tzset以下为新西兰的例子:

TZ="NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"

当你有时区文件,TZ应该以冒号开头来指示它们的用途:

TZ=:America/New_York

答案2

如果您可以将文件传输到其中,那么您可以将所需的时区定义从本地系统复制/usr/share/zoneinfo/etc/localtime受限系统上。在 Alpine 容器中进行测试:

% docker run --rm -it alpine date
Fri Sep  1 07:15:13 UTC 2023
% docker run --rm -it -v /usr/share/zoneinfo/Asia/Calcutta:/etc/localtime alpine date
Fri Sep  1 12:45:17 IST 2023

您的命令列表包括ashbusybox。 IIRC Linux 上 Almquist shell 的常见版本是 dash 和 busybox sh,并且可能像 Alpine 一样,您的大多数命令只是busybox.通过使用 Alpine 进行测试,我认为它将能够代表您的系统。

如果您拥有 root SSH 访问权限,但它受到某种限制而不允许 SFTP 和 scp,您可以尝试:

ssh limited-server 'cat > /etc/localtime' < /usr/share/zoneinfo/Some/Place

相关内容