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

Hen*_*nry 6 linux date time timezone

我有一台 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
Run Code Online (Sandbox Code Playgroud)

另外,它没有/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
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*itt 13

如果您没有\xe2\x80\x99t 时区文件,您仍然可以通过在变量中描述来指定时区TZ(请参阅man tzset参考资料)。

\n

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

\n
TZ=CEST-2\n
Run Code Online (Sandbox Code Playgroud)\n

中欧夏令时或

\n
TZ=EDT4\n
Run Code Online (Sandbox Code Playgroud)\n

东部夏令时间。

\n

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

\n
TZ="NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
TZ=:America/New_York\n
Run Code Online (Sandbox Code Playgroud)\n

  • 是的,它是一个像其他变量一样的 shell 变量;`TZ=EDT4 date` 仅为 `date` 的调用设置它。如果您希望它持续存在,则需要导出它(这将为当前 shell 进程的所有子进程设置它),如果您希望更广泛地使用它,则需要在启动脚本中设置它。 (10认同)

mur*_*uru 5

如果您可以将文件传输到其中,那么您可以将所需的时区定义从本地系统复制/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
Run Code Online (Sandbox Code Playgroud)

您的命令列表包括ash和busybox。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
Run Code Online (Sandbox Code Playgroud)