На *BSD:
date -r 1234567890
На Linux (а именно, с GNU coreutils ≥5.3):
date -d @1234567890
С более старыми версиями даты GNU можно вычислить относительную разницу для эпохи UTC:
date -d '1970-01-01 UTC + 1234567890 seconds'
При необходимости в мобильности Вам не повезло. Единственное время, которое можно отформатировать с командой оболочки POSIX (не делая вычисления сами) строка, является текущим временем. На практике Perl часто доступен:
perl -le 'print scalar localtime $ARGV[0]' 1234567890
Вот критерии, которые я использую в моем ~/.profile
:
SSH_CLIENT
или SSH_TTY
определяется, это - ssh сессия.sshd
, это - ssh сессия.if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
SESSION_TYPE=remote/ssh
# many other tests omitted
else
case $(ps -o comm= -p $PPID) in
sshd|*/sshd) SESSION_TYPE=remote/ssh;;
esac
fi
(Почему Вы хотели бы протестировать это в своей конфигурации оболочки, а не своем запуске сессии?)
Необходимо смочь проверить через SSH_TTY
, SSH_CONNECTION
, или SSH_CLIENT
переменные.
env_keep
в sudoers
заставить его работать через su
команды:)
– Thomas G.
31.03.2016, 20:00
У меня просто была та же проблема в Linux, с помощью Bash. Я сначала использовал переменную среды SSH_CONNECTION, но затем понял, что это не установлено если Вы su -
.
lastlog решение выше не работало ни один после su
или su -
.
Наконец, я использую who am i
, который показывает удаленный IP (или имя хоста) в конце, если это - соединение SSH. Это также работает после su.
Используя регулярные выражения Bash, это работает:
if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi
Если zsh не поддерживает регулярные выражения, то же может быть достигнуто по-разному с grep, сокращено, sed, или что бы то ни было.
Для любопытного, ниже то, что я использую это для в .bashrc корня:
# We don't allow root login over ssh.
# To enable root X forwarding if we are logged in over SSH,
# use the .Xauthority file of the user who did su
w=$(who am i)
if [[ $w =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then
olduser=${w/ .*/}
oldhome=$(getent passwd $olduser | cut -d: -f 6)
[ -f "$oldhome/.Xauthority" ] \
&& export XAUTHORITY=$oldhome/.Xauthority
fi
Альтернатива, которая также работает с su
должен был бы рекурсивно искать sshd
посредством родительских процессов:
#!/bin/bash
function is_ssh() {
p=${1:-$PPID}
read pid name x ppid y < <( cat /proc/$p/stat )
# or: read pid name ppid < <(ps -o pid= -o comm= -o ppid= -p $p)
[[ "$name" =~ sshd ]] && { echo "Is SSH : $pid $name"; return 0; }
[ "$ppid" -le 1 ] && { echo "Adam is $pid $name"; return 1; }
is_ssh $ppid
}
is_ssh $PPID
exit $?
Если функция добавляется к .bashrc, она может использоваться как if is_ssh; then ...
tmux
сессии и также имеют проблемы, если зарегистрировано на пути, IPv6 и никакое имя реверса DNS существуют. большое спасибо
– bene
10.02.2013, 18:58
who am i
не показывают Ваш адрес IPv6?
– mivk
10.02.2013, 21:08
who am i
ничего не возвращает в удаленном tmux
сессия. 2) адрес IPv6 мог бы содержать двоеточия, которые не позволяет Ваш regex. Это могло бы быть хитро с тех пор who am i
содержит (:0.0)
на X сессиях для меня (xterm). Linux Mint
– bene
11.02.2013, 17:05
screen
.
– mivk
15.12.2013, 16:54
Я думаю, Gilles и ответы Cakemox хороши, но только для полноты...
Last login: Fri Mar 18 23:07:28 CET 2011 from max on pts/1
прибывает из pam_lastlog
1.
Можно распечатать pam_lastlog
информация с помощью lastlog
2 команды, например.
$ lastlog -u mikel
Username Port From Latest
mikel tty1 Fri Jan 28 10:58:10 +1100 2011
для локального входа в систему, по сравнению с
Username Port From Latest
mikel pts/9 mikel-laptop Sat Mar 19 11:11:58 +1100 2011
для входа в систему SSH.
В моей системе это работает для извлечения его
$ lastlog -u mikel | sed -ne '2{p;q}' | cut -c 27-42
mikel-laptop
last
и w
могло быть полезным также, например
$ TTY=$(tty)
$ last -n 1 ${TTY#/dev/} | sed -ne '1{p;q}'
mikel pts/12 :0.0 Sat Mar 19 11:29 still logged in
pam_lastlog
.lastlog(8)
страницы справочника. Начните с точки зрения вашей среды и нахождение правильного варианта
printenv|grep SSH
SSH_CLIENT=192.168.1.xxx
SSH_CONNECTION=192.168.1.xxx
SSH_TTY=/dev/ttys021
. Вы можете подключить многие из этих переменных среды, чтобы вызвать конкретные действия, основанные на их присутствии.
Это проверка всех установленных соединений от другого пользователя с использованием SSH
netstat | grep ssh
.profile
. И что это имеет отношение к передаче агента? – Gilles 'SO- stop being evil' 14.04.2014, 23:41SSH_AUTH_SOCK
переменная. Но почему Вы выполнили бы агент SSH в этом случае? Вы имеете в виду, запускают агент, если Вы зарегистрированы без передачи агента? Почему бы не запустить агент, если уже нет одного ([ -n "$SSH_AUTH_SOCK" ] || eval $(ssh-agent)
)? использование – Gilles 'SO- stop being evil' 15.04.2014, 22:11SSH_*
переменные также установлены в подпроцессах оболочки, которая это во главе сессии SSH, например, если Вы запускаете экранную сессию по SSH (необходимо сбросить переменные прежде, чем запустить сессию, если Вы заботитесь). Я думаю, что причина тестирования родительского процесса состоит в том, что я начал делать это, прежде чем sshd определил любые переменные среды. – Gilles 'SO- stop being evil' 07.03.2017, 23:02