У меня просто была та же проблема в 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 ...
Можно работать passwd --delete <username>
после создания пользователя с adduser
. После этого Вы сможете войти в систему, не вводя пароль.
Пользователь в/etc/passwd с корневым каталогом/dev/null и оболочкой/sbin/nologin, может использоваться для sudo команд луга, но не может на самом деле войтись, например;
от моего/etc/passwd
tcpdump:x:104:441:added by portage for tcpdump:/dev/null:/sbin/nologin
Я половина помнит это, заставлю ее исчезнуть из экрана входа в систему XDM также, но я больше не использую XDM, таким образом, это - предположение :-)
Я не могу быть уверен в OSX, но на FreeBSD можно использовать:
pw add user mymuser -g mygroup -s /nonexistent -h -
значение -
переданный -h
опция говорит pw
установить поле пароля в master.passwd к *
, таким образом создавая учетную запись без входов в систему. Установка оболочки не строго необходима, но избегает проверки оболочки от/etc/pw.conf.
Если Вы находитесь на Ubuntu, можно загрузить пароль для пользователя Ubuntu в выезде/etc/shadow эта статья:
http://www.psychocats.net/ubuntucat/creating-a-passwordless-account-in-ubuntu/
Отъезд поля пароля, пустого для пользователя в passwd
файл будет работать.
Вы можете использовать usermod
, который отключит пароль с помощью !
, а не *
.
usermod -L <username>
Из man-страницы на usermod:
-L, --lock Lock a user's password. This puts a '!' in front of the encrypted password, effectively disabling the password.
В Linux я использую:
sudo useradd -r -p \* -s /sbin/nologin -c "Comment My Daemon,,," -d "/var/uuu" myuser
Следующая альтернатива должна быть более кроссплатформенной (если параметр -r
недоступен):
sudo useradd -K UID_MIN=100 -K UID_MAX=499 -K GID_MIN=100 -K GID_MAX=499 -p \* -s /sbin/nologin -c "Comment My Daemon,,," -d "/var/uuu" myuser
Здесь:
пароль в / etc / shadow будет установлено значение *
. Без -p \ *
будет !
оболочка будет / sbin / nologin
(Вы также можете использовать / bin / false
, но я думаю, что / bin
может быть смонтирован слишком поздно некоторые системы). Таким образом, пользователь не может войти в систему
-d
устанавливает домашний адрес пользователя
ВАЖНОЕ ПРИМЕЧАНИЕ
Здесь -r
создает системного пользователя:
Этот флаг используется для создания системы учетная запись. То есть пользователь с UID
ниже значения UID_MIN
, определенного в /etc/login.defs , и чей пароль не истекает. Обратите внимание, что useradd не будет создавать домашний каталог для такого пользователя, независимо от настройки по умолчанию в /etc/login.defs . Вы должны указать опцию -m
, если хотите создать домашний каталог для системной учетной записи. Это опция, добавленная Red Hat .
Параметр -r
может отсутствовать в вашей системе. Итак, чтобы создать системного пользователя, который не отображается на экране входа в систему, я думаю, вы можете использовать параметр -K
. Примерно так: -K UID_MIN = 100 -K UID_MAX = 499
. Вы можете попробовать такой вариант:
-K UID_MAX=$(cat /etc/login.defs | grep ^UID_MIN | awk '{print $2}')
, чтобы автоматически определить вас UID_MAX
, но я не тестировал на OS X. Вам понадобится SYS_UID_MAX
для UID_MIN
], если он раскомментирован в / etc / login.defs
То же самое для GID_MAX
и GID_MIN
для идентификатора системной группы. (См. GID_MIN
и, если раскомментировать SYS_GID_MAX
в /etc/login.defs для использования в качестве GID_MAX
)