Команда выполнения на удаленном сервере по SSH - без выхода

Я соединяюсь с 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 автоматически, не закрывая соединение позже?

5
задан 20 February 2016 в 20:50

4 ответа

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'
3
ответ дан 23 November 2019 в 08:43

Просто выполнение bash должно быть достаточно:

 sshpass -f <password_file> ssh <user@ipaddress> 'who; bash';
5
ответ дан 23 November 2019 в 08:43

Это ответ, но определенно не эти ответ.

я обнаружил, что 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 из-за отсутствия разрешений, или безотносительно другой причины.

3
ответ дан 23 November 2019 в 08:43

ответ 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
3
ответ дан 23 November 2019 в 08:43

Другие вопросы по тегам:

Похожие вопросы: