SSHが使用するシェルを選択しますか?


31

ユーザーがサーバーにSSH接続するときに使用されるシェルを設定するにはどうすればよいですか。たとえば、BASHを我慢できず、ZSHを使用する必要があり.zsh_profileます。マシンにsshするときにZSHがプロファイル()とともにロードされるようにするにはどうすればよいですか。

sshでたくさんのパラメーターを渡す必要はありません。デフォルトのシェルを設定できませんか?

回答:


34

Linuxで実行していると仮定すると、chshコマンドを使用できます。

chsh -s /bin/ksh foo
chsh -s /bin/bash username

4
/etc/shellsシェルを選択可能にするには、バイナリへのパスを指定する必要があることに注意してください。
キムベー

Ubuntu 16.04にはこのコマンドはありません。
-david.perez

@ david.perezはいpasswdパッケージに含まれています
デザート

認証がLDAPを介して処理される場合、これは機能しません
ダニエル・カッツ

10

man chsh シェルを変更し、常に機能するとは限りません

または、exec /bin/zshbashログインスクリプトを使用することもできます。これにより、bashインスタンスがシェルに置き換えられます。

またはあなたがすることができます ssh host "zsh -l"


なぜ-1(15文字...)?
ヌファルイブラヒム

それは小文字ですL
-driftcatcher

1
ssh -t最後のオプションのTTYを取得するために必要です。デフォルトでは、コマンド(などzsh -l)が提供されると、OpenSSHは非ログインシェルを-l実行します。これはTTYを割り当てず、それを変更しません(ログイン後に実行されるため)。
フランクリンゆう

8

/ etc / passwdを編集して(権限がある場合、またはシステム管理者に問い合わせて)デフォルトのシェルを変更します。


何らかの理由で、最近作成したユーザーにはデフォルトのシェルがありませんでした。これは私のために働いた。ありがとう。
mimoralea 14

2
この答えは素晴らしいですありがとうございます。ここにもシェルがありませんでした。行myusername:x:1000:1000 :: / home / myusername:を見つけて、最後に/ bin / bashを追加しました。ログアウトしてログインすると、sshセッションでbashが使用されます:)
スチュワート

6

デフォルトのシェルを変更できない場合、ssh -t user@host 'zsh -l'動作します。

-tフラグは、仮想端末の割り当て、及び強制-lフラグスポーンログインシェル


4

ローカル.zshrcサーバーをリモートサーバーにどのように配置できるかわかりません(そこに永続的に保存する必要はありません)、これはリモートサーバー上のログインシェルを変更するために機能します。

共有アカウントであるzshため、この方法で使用できるのは自分だけです。

これを~/.ssh/configローカルマシンのファイルに追加します。

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

以下のように、探していることを達成するためのハック的な方法があるかもしれません。

警告 これには保証がなく、「賢明」ではありませんが、ローカルファイルをサーバーに配置し、これを使用してログインシェルでソースを作成することができました。

Host someHost
    HostName someIP
    IdentityFile ~/.ssh/somekey.pem
    RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
    PermitLocalCommand yes
    LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
    RequestTTY force
    User someUser

使い方?

  • RemoteCommand リモート側で実行する必要があるものを定義します。
  • LocalCommandローカルで実行する必要があるものを定義します。これは、ローカルファイルをリモートサーバーにコピーしてソースにするために使用されます。これが問題です。リモートホストへの接続が「成功」した後にのみ発生します。

意味:

  1. リモートへの接続が開いていて生きている必要があります
  2. リモートシェルにはまだファイルがないため、ファイルが存在するまで待機する必要があります、ergo sleep
  3. ローカルはsftpファイルをリモートサーバーに配置するために使用し、リモートサーバーはsleepスクリプトから起動してスクリプトをソースします。

それは非常にハック的です、私はより良い方法もあるかどうか知りたいです。

更新:これは「長い」スリープ時間の代わりに使用できます:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.