Я соединяюсь с Linux Lab своей школы часто для работы над моими распределениями работы по программированию удаленно. Иногда, когда существует много других студентов, зарегистрированных к серверу, соединение является медленным, и я теряю работу во время тайм-аутов соединения. Существует несколько серверов для выбора из в лаборатории, и я хочу смочь автоматически работать who
как только связь установлена, таким образом, я вижу, насколько переполненный сервер, и используйте другой, если это довольно полно. Прямо сейчас я использую функцию в своем .bash_aliases файле для оптимизации записи соединения и ввода пароля:
В файле ~/.bash_aliases
:
#!/bin/bash
# ssh to the Linux lab. Takes hostnames defined in ~/.ssh/config as
# parameters
function sshll()
{
if [ "$@" ]
echo "Connecting to hostname $@";
sshpass -f <password_file> ssh $@;
else
echo "Connecting to default host";
sshpass -f <password_file> ssh <user@ipaddress>;
fi
}
Это работает, таким образом, я добавил who
в конец ssh
команды:
В файле ~/.bash_aliases
:
#!/bin/bash
# ssh to the linux lab. Takes hostnames defined in ~/.ssh/config as
# parameters
function sshll()
{
if [ "$@" ]
echo "Connecting to hostname $@";
sshpass -f <password_file> ssh $@ 'who';
else
echo "Connecting to default host";
sshpass -f <password_file> ssh <user@ipaddress> 'who';
fi
}
Это соединяет, вводит мой пароль автоматически и выполнения who
, но затем закрывает соединение. Есть ли способ, которым я могу работать who
автоматически, не закрывая соединение позже?
TL; DR : ответ int_ua - путь, самый простой и легкий.
Почему это работает так, как работает
Это восходит к основному поведению любой оболочки. Когда вы входите просто как ssh user@server.domain.whatever
, вы получаете интерактивную версию оболочки. Когда вы запускаете ssh user@some.server.net -t "command1;command2"
, вы в основном получаете /bin/sh -c 'command1;command2'
. Первый позволяет вам запускать все, что вы положили в stdin
при поиске файлов точек, а второй просто выполняет эти команды и завершает работу. По сути, нет способа запустить команду перед интерактивным использованием (если она не находится в одном из файлов точек) или получить интерактивную оболочку из команды single-shot sh -c
(или какой бы она ни была, необязательно sh
]).
Неудачные или неполные идеи
Моя первая идея, которая у меня возникла, такова: если оболочка использует локальный сервер .bashrc
, можно ли заставить его использовать локальный файл клиента на сервере? Ну, не . Только если вы не скопируете файл точек на удаленный сервер с помощью scp или rsync.
Вторая идея, которая у меня была, это PROMPT_COMMAND
. Эта очень хорошая переменная bash
запускает команду каждый раз перед отображением вашего приглашения PS1
, так почему бы не установить эту переменную до появления bash
в PROMPT_COMMAND="who; unset PROMPT_COMMAND"
, чтобы мы запускали ее как одиночный бросок?
Проблема в том, что эту переменную нужно экспортировать на удаленный сервер, и ответ Жиля помог мне сделать что-то вроде этого:
ssh -o SendEnv=PS1 ssh localhost -t bash
или
[ 111] Проблема? -o опция SendEnv должна разрешать эту конкретную переменную, которую вы пытаетесь отправить в /etc/ssh/sshd_config
, и, кроме того, в любом случае вы все равно можете запускать все эти вещи с /bin/sh -c
Небольшое улучшение для int_ua ответ
Итак, теперь мы можем видеть, что шаблон ssh user@server -t 'command1;shell'
работает лучше всего. За исключением того, что есть один незначительный клеветник: процесс /bin/sh -c
все еще там, так почему бы не запустить bash
с exec
, чтобы заменить этот процесс?
ssh user@server.net -t 'who;exec bash'
Просто выполнение bash
должно быть достаточно:
sshpass -f <password_file> ssh <user@ipaddress> 'who; bash';
Это ответ, но определенно не эти ответ.
я обнаружил, что sshd
(демон для ssh услуг на отдаленного хозяина) будет управлять командами в ~/.ssh/rc на связь. Я просто создал этот файл и добавил who
там, и теперь список пользователей показан каждый раз, когда я устанавливаю удаленную связь, и я все еще получаю раковину логина.
На отдаленном хозяине:
File ~/.ssh/rc:
#!/bin/bash
# This file is executed by sshd when a remote connection is started over ssh
who
На клиенте:
In file ~/.bash_aliases:
#!/bin/bash
# ssh to the linux lab. Takes hostnames defined in ~/.ssh/config as
# parameters
function sshll()
{
if [ "$@" ]
echo "Connecting to hostname $@";
sshpass -f <password_file> ssh $@;
else
echo "Connecting to default host";
sshpass -f <password_file> ssh <user@ipaddress>;
fi
}
я все еще интересуюсь знанием, как сделать это со стороны клиента, однако, для других пользователей с подобными проблемами, которые не могут использовать ~/.ssh/rc из-за отсутствия разрешений, или безотносительно другой причины.
ответ int_ua - то, что я использовал бы. Только для полноты, если можно отредактировать собственное .profile
или .bashrc
на удаленном сервере, Вы могли бы добавить это к любому:
if [[ -n $SSH_TTY ]]
then
who
fi
SSH устанавливает различные переменные, одна из которых SSH_TTY
- можно протестировать на эти переменные, чтобы определить, соединены ли Вы через SSH. Ограничения на ~/.ssh/rc
не должны препятствовать тому, чтобы Вы использовали это.
я использую это для установки моей подсказки (примечание, как я пропускаю имя хоста для локальных оболочек):
if [[ -n $SSH_TTY ]]
then
PS1="\u@\h:\w \$ "
else
PS1="\u:\w \$ "
fi