当我通过 SSH 连接到服务器时更改默认目录

Bob*_*ing 66 linux ubuntu ssh

我想知道是否有办法更改我在 SSH 到我的 Ubuntu 服务器后放入的默认目录。

当我登录到我的服务器时,99% 的时间是访问特定目录中的文件:

/var/www/websites
Run Code Online (Sandbox Code Playgroud)

是否有我可以编辑的配置文件,以确保我在登录时直接进入该目录?

Den*_*ker 82

有以下三种方法可以实现:

  • 添加cd /var/www/websites到您的.bash_profile. 这仅对交互式登录(例如 ssh)执行。
  • 添加cd /var/www/websites到您的.bashrc. 我在我们的 puppetmasters 上使用这个,因为我总是想在 /etc/puppet/environments/dkaarsemaker 那里而不是我的 homedir :-)
  • 将服务器上的主目录更改为 /var/www/websites(这不是一个好主意)

  • 你可能想把它放在你的 `.profile` 而不是 `.bashrc` 中,但这取决于你的用例。`.profile` 只对交互式登录(例如 shell)执行,但 `.bashrc` 也为非交互式登录(例如 scp、rsync 等)执行。此外,.profile 更有可能被非 bash 的 shell(例如 zsh)调用。 (10认同)
  • 哦,我不会那样做,因为它会影响所有用户。最好编辑 /home/yourlogin/.bashrc (8认同)

ger*_*tas 22

如果您使用密钥进行 SSH 登录,那么您可以通过command=远程服务器~/.ssh/authorized_keys上的密钥之前添加来更改路径。例子:

command="cd /var/www/websites ; /bin/bash -l" ssh-rsa AAA.....rest of the key
Run Code Online (Sandbox Code Playgroud)

可以为同一用户生成和使用多个密钥。服务器上的一个键可能包含命令,另一个可能不包含 - 这样您就可以在登录时选择预期的行为。你可以简单地用local 把它包起来~/.ssh/config

Host websites-my-host
    HostName <realhostname>
    IdentityFile ~/.ssh/<key1>  #on the server key with "command"
    User webmaster

Host my-host
    HostName <realhostname>
    IdentityFile ~/.ssh/<key2>  #on the server key without command
    User webmaster
Run Code Online (Sandbox Code Playgroud)

这是会发生的事情:

local$ ssh websites-my-host
webmaster@realhostname:/var/www/websites$ _
Run Code Online (Sandbox Code Playgroud)

或者:

local$ ssh my-host
webmaster@realhostname:~$ _
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个问题,而不是公认的问题。它允许多个用户在服务器上使用同一个用户,并且仍然能够自定义您个人登录时发生的情况。与另一个用户一样灵活和正确。 (4认同)
  • 你可以使用 `$SSH_ORIGINAL_COMMAND` 而不是 `/bin/bash -l` 来让工具工作(在我的例子中是 hg)。或者`$SHELL`,如果你不想硬编码到bash。不确定如何让工具和人工登录同时工作。 (3认同)
  • 这里你必须非常小心,因为向 ~/.ssh/authorized_keys 添加命令会影响其他基于 ssh 的工具,如 rsync、scp。这些命令将简单地挂起 (2认同)
  • 请注意:如果您已禁用 PasswordAuthentication(请参阅 https://askubuntu.com/questions/346857/how-do-i-force-ssh-to-only-allow-users-with-a-key-to -log-in) 并且不小心输入了命令字符串,您可能会将自己锁定在系统之外。 (2认同)

igo*_*s07 10

从 OpenSSH 7.6 开始,您可以使用新的 RemoteCommand 选项来实现这一点。

在您的~/.ssh/config

Host websites-my-host
    HostName <realhostname>
    IdentityFile ~/.ssh/keyfile
    User webmaster
    RequestTTY force # check if this is necessary
    RemoteCommand cd /var/www/websites && bash -l
Run Code Online (Sandbox Code Playgroud)


小智 9

默认情况下,Openssh sshd 接受来自客户端的这些环境变量:

AcceptEnv LANG LC_*
Run Code Online (Sandbox Code Playgroud)

您可以使用它从客户端的本地环境向服务器发送一个值,如下所示:

LC_CDPATH=/var/www/websites ssh -o SendEnv=LC_CDPATH user@server
Run Code Online (Sandbox Code Playgroud)

您可以将 SendEnv 指令放在 ~/.ssh/config 中,这样您就不必在命令行中包含它。

如果您将以下内容放在 ~/.profile 中(仅影响交互式登录使用 .profile,影响所有登录使用 .bashrc):

if [ "$LC_CDPATH" -a -d "$LC_CDPATH" ]; then
  cd "$LC_CDPATH";
fi
Run Code Online (Sandbox Code Playgroud)

然后它会在您登录时自动将目录更改为环境变量中指定的目录,如果指定了并且是目录。

  • “LC_*”技巧+1 (2认同)