ssh 命令和普通 ssh 的时区不同

ssh 命令和普通 ssh 的时区不同

每当我通过 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,或者应该是不同的时区,但计算机应该知道它是什么时区。

相关内容