每当我通过 SSH 运行日期命令时,时区都会显示不同,如果我使用 SSH 登录服务器并运行相同的命令,则完全不同。
使用 SSH 运行命令
>ssh root@server 'date'
[root@server]# date
Mon Sep 22 03:06:33 EDT 2014
使用 SSH 登录后运行命令。
[root@server ~]# date
Mon Sep 22 00:07:28 PDT 2014
[root@server ~]#
我的第二个案例的时区是正确的。
答案1
可能通过 或 设置了错误的 TZ .profile
,.bash_profile
从而bashrc
覆盖了/etc/timezone
答案2
在 unix 上,可以通过设置环境变量 TZ 来设置单个进程的时区。每个进程可以具有不同的 TZ 值,从而显示不同的时区。如果未设置 TZ,则使用系统范围的默认值。
在第二个示例中,您运行 ssh 并指定要在远程服务器上运行的命令。因此,ssh 设置了一个普通的交互式会话,而远程系统上的 shell 完成了交互式会话所需的所有初始化。
在第一个示例 ( ssh root@server 'date'
) 中,您告诉 ssh 在远程主机上运行特定命令。在本例中,ssh 在没有 TTY 的情况下运行了该命令。当远程会话没有 TTY 时,shell 的远程实例不会执行它通常为交互式会话执行的所有初始化。因此它跳过了获取某些文件(例如您的.profile
或系统范围的配置文件)的过程。
看来您的 shell 的一个初始化文件将 TZ 设置为美国太平洋时区之一。当您以交互方式登录系统时,会进行此初始化,并且您会看到 PDT 时间。当您以非交互方式登录时,此步骤将被跳过,并且您将获得不同的时区。
您可以在非交互方式运行命令时设置时区:
ssh user@host 'TZ=US/Pacific date'
或者您可以强制 ssh 分配一个 TTY,这应该会导致您的远程 shell 执行额外的初始化:
ssh -t user@host 'date'
但你真正应该做的是纠正你的 shell 初始化文件。如果你希望每次都设置时区,那么你应该将设置 TZ 的命令移动到每次都执行,而不仅仅是在交互式会话中执行。
答案3
时区在设计上取决于客户端。想象一下,全球各地的许多客户端访问同一台服务器 - 他们应该看到不同的时间和时区。
因此,在客户端检查您的客户端的设置。
更新
两台计算机上的时间都应该是正确的。正确意味着计算机可以得出 UTC 时间。即系统时钟应该是 UTC,或者应该是不同的时区,但计算机应该知道它是什么时区。