我有一台 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
目录。
那么如何使用这些命令设置时区呢?我还需要从另一台主机远程同步时区和日期。
我尝试了TZ
env 变量,但它不起作用,例如:
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
您的命令列表包括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