Как переключиться между пользователями на одном терминале?

Одинарные левые кавычки старого стиля ` ` действительно рассматривайте обратные косые черты и немного отличающееся вложение. Новый стиль $() интерпретирует все промежуточное ( ) как команда.

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

работы, если вложенных одинарных левых кавычек оставляют:

echo `uname | \`echo cat\``
Linux

забава обратной косой черты:

echo $(echo '\\')
\\

echo `echo '\\'`
\

Новый стиль $() относится ко всем совместимым на POSIX оболочкам.
Как mouviciel указанный, старого стиля ` ` могло бы быть необходимым для более старых оболочек.

Кроме технической точки зрения, старого стиля ` ` имеет также визуальный недостаток:

  • Трудно заметить: I like $(program) better than `program`
  • Легко перепутанный с одинарной кавычкой: '`'`''`''`'`''`'
  • Не настолько легкий ввести (возможно, даже на стандартном расположении клавиатуры)

(и использование SE ` ` для собственной цели это была боль, пишущий этот ответ :)

515
06.01.2011, 14:13
10 ответов

Как насчет того, чтобы использовать su команда?

$ whoami
user1
$ su - user2
Password:
$ whoami
user2
$ exit
logout

Если Вы хотите войти в систему как корень, нет никакой потребности указать имя пользователя:

$ whoami
user1
$ su -
Password:
$ whoami
root
$ exit
logout

Обычно можно использовать sudo для запуска новой оболочки как, пользователь, Вы хотите; -u флаг позволяет Вам указать имя пользователя, которое Вы хотите:

$ whoami
user1
$ sudo -u user2 zsh
$ whoami
user2

Существует больше окольных путей, если у Вас нет sudo доступа, как ssh username@localhost, но sudo является, вероятно, самым простым, при условии, что это установлено, и у Вас есть разрешение использовать его.

604
27.01.2020, 19:27
  • 1
    Кроме того, su - [user] может быть полезным - дополнительный тире дает Вам оболочку входа в систему. –  ephemient 27.10.2010, 23:40
  • 2
    Я могу использовать pkg-конфигурацию для получения флагов, но они не появляются в моем Make-файле. $pkg-config - cflags dbus-glib-1-pthread-I/usr/include/dbus-1.0-I/usr/lib/dbus-1.0/include-I/usr/include/glib-2.0-I/usr/lib/glib-2.0/include $pkg-config - освобождает dbus-glib-1-pthread-L/lib-ldbus-glib-1-ldbus-1-lpthread-lgobject-2.0-lgthread-2.0-lrt-lglib-2.0---------121-------234337----ls-l/var/lib/db2/db2inst1/sqllib/adm/db2syscr, дает мне -r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr* ---------121 большое спасибо--------44882----за Ваш ответ. Я уже установил его через виртуальную машину, как объяснено в вышеупомянутом ответе. BTW поле семени mandriva, кажется, более легкая опция. Конечно, попробует его в следующий раз, когда кажется, что $PWD оценен только в первый раз apt-get -t stable install php5-memcached Не работал: php5-memcached : Depends: libmemcached11 but it is not installable E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution). ---------121 спасибо--------138639----, но это не работало на меня. Я отодвинул папку, впоследствии перезапустил gedit, но тем не менее темой является нестандартная, а также используемые плагины являются теми, я имел в прошлый раз, когда я использую rm -f часто на clean цель в Makefiles--------121--------55005----@terdon я использую GNU grep 2.12--------121--------137117----Спасибо за Ваш ответ. Но можно ли сказать что-то больше относительно того, каков тот рекурсивный метод? Я слышу его в 1-й раз, когда кажется, что этот сценарий делает то же самое три раза, я установил его на том же разделе, где я установил его в прошлый раз Эй, я не перерабатывал это, как прошлый раз, Да l этимологически для длинного целого со времени где longs, где 32 бита шириной. l остался и, как гарантируют, останется 32 бита шириной даже в системы где longs более широки (так l больше средства long на практике). Использовать l! если Вы хотите свою систему/компилятор longs--------121--------122412----[root@CentOS-7} # об/мин-ql iptables-services.x86_64/etc/sysconfig/ip6tables/etc/sysconfig/iptables/usr/lib/systemd/system/ip6tables.service/usr/lib/systemd/system/iptables.service/usr/libexec/initscripts/legacy-actions/ip6tables/usr/libexec/initscripts/legacy-actions/ip6tables/panic/usr/libexec/initscripts/legacy-actions/ip6tables/save/usr/libexec/initscripts/legacy-actions/iptables/usr/libexec/initscripts/legacy-actions/iptables/panic/usr/libexec/initscripts/legacy-actions/iptables/save/usr/libexec/iptables/usr/libexec/iptables/ip6tables.init/usr/libexec/iptables/iptables.init---------121--------78156-Удостоверяется, что помнил это в следующий раз, когда я получаю эту ошибку "-su:/dev/stderr: Разрешение, отклоненное" после выполнения этой команды echo >>/dev/stderr на входе в систему с su --login ..., какая-либо подсказка? Я нашел этот btw unix.stackexchange.com/questions/38538 / … –  Aquarius Power 24.11.2014, 20:58
  • 3
    Это позволяет каждому новому пользователю иметь различные, переопределяющие значения для переменных среды? например, мерзавец конфигурируется для работы, открытого исходного кода, и т.д. –  Kevin Suttle 23.12.2015, 23:13
  • 4
    Одно открытие, когда я перечислил env это видело, что все было в порядке, а также визуальный контроль может пойти; И одна вещь была неправильной: XAUTHORITY=/home/user1/.Xauthority'. Not sure _why_? So X-window doesn't work by default because the protection on ~/.Xauthority' файл: -rw-------. Я сделал копию, и это позволило мне выполнить gedit как эксперимент. –  will 26.12.2015, 13:47

Обычно Вы используете sudo для запуска новой оболочки как, пользователь, Вы хотите; -u флаг позволяет Вам указать имя пользователя, которое Вы хотите:

[mrozekma@etudes-1 ~] % whoami
mrozekma
[mrozekma@etudes-1 ~] % sudo -u nobody zsh
[nobody@etudes-1 ~] % whoami
nobody

Существует больше окольных путей, если у Вас нет sudo доступа, как ssh username@localhost, но я думаю sudo является, вероятно, самым простым, если это установлено, и у Вас есть разрешение использовать его

51
27.01.2020, 19:27
  • 1
    Что, если моя система не имеет ни одного ssh сервер или sudo? Можно ли упомянуть что часть на ответе? –  tshepang 27.10.2010, 22:52
  • 2
    хорошо, Pratt ответил что один –  tshepang 27.10.2010, 23:01
  • 3
    sudo -s дает Вам оболочку как su, sudo -i моделирует вход в систему как su -. Может быть объединен с -u $user, конечно. –  ephemient 27.10.2010, 23:41
  • 4
    . способность "войти в систему" как пользователь, который не может обычно входить в систему, является большим активом..! полностью разрешенный меня для выполнения экземпляра базы данных, не смешивая с полномочиями или selinux –  Félix Gagnon-Grenier 12.10.2016, 18:01
$ whoami 

Эта команда печатает текущего пользователя. Чтобы изменить пользователей, мы должны использовать эту команду (за которой следует пароль пользователя):

$ su secondUser
Password:

После ввода правильного пароля, вы войдете в систему под именем указанного пользователя (что можно проверить, повторно запустив whoami).

25
27.01.2020, 19:27

Если вы сменили имя хоста на «богон», поэтому приглашение изменилось. При необходимости можно изменить переменную $ PS1 в /etc/bash.bashrc так, чтобы она всегда отображала username @ localhost вместо username @ hostname .

-121--146239-

Мой сценарий работает, если оба значения, разделенные разделителем, имеют одинаковое количество символов.

Если бы вы хотели произвольное количество мест, это было бы невозможно, потому что вы могли бы попасть в такие ситуации, как:

key1 12|1222 10|15

key1 12 10
key1 1222 15

В этой ситуации вы просто не можете выровнять '15' в столбец под '10', потому что столбец уже занят '1222'.

EDIT: Я переписал код, поэтому он принимает произвольное количество строк и даже произвольное количество труб:-)


CODE:

script.sh:

#!/bin/bash

# count max number of pipes -> recognizes number of lines
countPipes() {
    num=0
    line="$@"
    IFS=' '
    for item in $line; do
        tmp=$(echo "$item" | tr -d "[:alnum:][:space:]" | wc -c)

        if [[ "$num" < "$tmp" ]]; then
            num=$tmp
        fi
    done

    return $num
}

makeLines() {
    strTmp="$@" # one line from input file

    arrTmp=($strTmp)
    key=${arrTmp[0]}
    arrIN=$key

    # create output arrays (one array = one output line)
    countPipes $strTmp
    maxPipeCount=$? # assign the value of the last 'return'

    for((i=0;i<$maxPipeCount;++i)); do
        arrOUT[$i]="$key"
    done

    for item in ${strTmp[@]}; do
        # Delimiter handling
        if [[ $item == *\|* ]]; then # If there is a pipe
            IFS='|'
            tmp=($item) # variable containing pipe character -> split by space -> array
            IFS=' '

            arrIN="$arrIN ${tmp[0]}"

            for ((i=0;i<"${#arrOUT[@]}";++i)); do # fill columns in every output line - i = index in line
                if [[ "${#tmp[$(($i + 1))]}" -gt 0 ]]; then
                    arrOUT[$i]="${arrOUT[$i]} ${tmp[$(($i + 1))]}"
                else
                    # Handling spaces in output
                    for ((j=0;j<="${#tmp[0]}";++j)); do # filling line with spaces - j = just counter, not index
                        arrOUT[$i]="${arrOUT[$i]} "
                    done
                fi
            done

        elif [[ "$item" != "$key" ]]; then # If there isn't a pipe
            arrIN="$arrIN $item"

            # Handling spaces in output
            for ((i=0;i<"${#arrOUT[@]}";++i)); do # for every output line
                for j in { 1.."${#tmp[0]}" }; do # for every char in $item
                    arrOUT[$i]="${arrOUT[$i]} "
                done
            done
        fi
    done

    # PRINT RESULTS
    echo "$arrIN"

    for((i=0;i<"${#arrOUT[@]}";++i)); do # for every output line
        echo "${arrOUT[$i]}"
    done
    unset arrOUT

    echo '-----------------------------------------------------------'
}

while read line; do # load data from STDIN
    makeLines $line
done

Пример:

test.txt:

key1 10|15 20 30 11|XX|55 21 31|20 100
key2 11 25|30 58|22 44 33
key3 12|15|17|19 22 33 55|22 88|44|11 xxxx|2222|7777

Команда:

bash ./script.sh < test.txt 

OUTPUT:

key1 10 20 30 11 21 31 100
key1 15       XX    20   
key1          55         
-----------------------------------------------------------
key2 11 25 58 44 33
key2    30 22      
-----------------------------------------------------------
key3 12 22 33 55 88 xxxx
key3 15       22 44 2222
key3 17          11 7777
key3 19                 
-----------------------------------------------------------
-121--23392-

Чтобы переключить сеанс терминала на другого пользователя, где этот пользователь не может вернуться к исходному пользователю, используйте exec:

$ | # exec su - [имя _ пользователя]

Это позволит технически зарегистрировать нового пользователя в новом терминологическом процессе и закрыть текущий. Таким образом, когда пользователь пытается выйти или Ctrl-D, терминал закрывается, как если бы этот пользователь был тем, кто создал его экземпляр, то есть пользователь не может выйти обратно в термин исходного пользователя. Вроде бы бессмысленно, учитывая, что они все еще могут просто начать новый терминальный сеанс и автоматически быть в исходном пользовательском термин логин, но есть.

ПРАВКА: Для того, чтобы заблокировать терминальные сессии по умолчанию, можно использовать команду linux vlock в ~/.bashrc, требуя пароль пользователя term session для разблокировки. Это в некоторой степени предотвратит перезапуск вышеупомянутого термина в исходном пользовательском контексте, поскольку этот термин не создается с использованием значения, отличного от значения по умолчанию ~/.bashrc пользователя, как настроено.

9
27.01.2020, 19:27

Если требуется решение shellscript (которое также работает с OSX ), см. башлок .

-121--128863-

Вы также можете установить в службу/демон, который выполняет задания на основе временных характеристик, таких как «now + 7 дни». Сначала запустите atd (через сценарии init или systemd или upstart и т.д.). Затем поставьте задание в очередь с

at -f /path/to/command now + 7 days

, чтобы запустить его через 7 дней, или

at 2am tomorrow

и прочитайте команды, которые будут выполняться завтра в 2 утра. Вы хотите сделать тест или два, прежде чем ждать 7 дней, чтобы обнаружить, что он не сработал. Попробуйте сейчас + 1 минута

Один из способов выполнения пакета каждые 7 дней состоит в том, чтобы добавить пакет к другой по команде :

cat >~/bin/weekly-job.sh << AT
at -f ~/bin/weekly-job.sh now + 7 days
~/bin/database-job.sh
AT
-121--174642-
~$ sudo login

, после чего появится запрос на ввод пароля sudo (текущего пароля пользователя).

Также убедитесь, что текущий пользователь находится в файле sudoers!

-1
27.01.2020, 19:27

Если вы используете Ubuntu,и если для пользователя, под которым вы хотите войти, не установлен пароль:

sudo su - username

Введите свой собственный пароль, и он должен быть установлен. Конечно, для этого требуется, чтобы ваш пользователь имел права на получение привилегий root с помощью sudo .

16
27.01.2020, 19:27

Еще один путь - запустить новую оболочку от имени другого (не root) пользователя, чтобы выполнять команды от имени этого пользователя.

ubuntu@aws-ip:~$ sudo -u mongodb bash          #<-- or zsh, etc... 
mongodb@aws-ip:~$ mongod --configsvr --dbpath /data/configdb --fork

Примером может служить пользователь mongodb. При развертывании кластера MongoDB с шардированием все необходимые процессы должны выполняться от имени mongodb, и нет необходимости (или не совсем удобно) демонизировать эти процессы с помощью init-скриптов для десятков узлов.

2
27.01.2020, 19:27

sudo -iu мне поможет

3
27.01.2020, 19:27

Давайте разберемся: вы вошли в систему как UserA и хотите «войти» как UserB для выполнения некоторых команд, но после этого хотите вернуться к UserA. Для простоты я предполагаю, что вы хотите запустить ls -l / tmp как UserB. Если вы не хотите покинуть текущую оболочку UserA, а скорее выполняете команду как UserB и по-прежнему находитесь в системе как UserA, вам следует сделать следующее:

su - UserB -c "ls -l /tmp"   <-- Just an example

Предполагается, что вы знаете пароль для UserB. Однако, если вы не знаете пароль пользователя B, вам необходимо знать пароль root. Затем:

sudo su - UserB -c "ls -l /tmp"   <-- UserB's pw not needed here

Если вы предпочитаете временно войти в систему как UserB для выполнения множества команд, просто выполните:

sudo su - UserB

Это даст вам новую оболочку для UserB (проверьте это, набрав id). Когда закончите, вы можете нажать ctrl-d и вернуться к своему логину.

2
27.01.2020, 19:27

Если вам нужно запустить только одну команду, вы можете использовать sudo :sudo -u username command

1
27.01.2020, 19:27

Теги

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