обновите СОЕДИНЯЮТ переменную каналом в .bashrc, использующем sed

Если Вы хотите войти в систему как Testuser, затем да, необходимо удостовериться это ~Testuser, ~Testuser/.ssh и ~Testuser/.ssh/authorized_keys принадлежите пользователю Testuser, и что все три не перезаписываемы никаким другим пользователем, т.е.

chown Testuser ~Testuser ~Testuser/.ssh ~Testuser/.ssh/authorized_keys
chmod go-w ~Testuser ~Testuser/.ssh ~Testuser/.ssh/authorized_keys

Обратите внимание, что предпочтенный способ загрузить новый ключ к учетной записи состоит в том, чтобы использовать ssh-copy-id. Это устроило бы полномочия быть корректным.

Вы можете также иметь ~Testuser/.ssh и ~Testuser.ssh/authorized_keys принадлежавший корню, но это только для необычных установок, где Вы не хотите, чтобы пользователь смог изменить список авторизованных ключей. Файл должен быть читаемым Testuser в любом случае.

2
02.09.2012, 18:47
1 ответ

Первая вещь: не пишите в файл, из которого Вы читаете, Вы, вероятно, закончите тем, что стерли его. Используйте функцию оперативного редактирования (-i) вместо этого.

Затем, в твердых кавычках ('), подстановка переменных не работает, таким образом, необходимо будет сделать что-то еще для получения расширенного $PATH замененный там.

Наконец, $PATH очень вероятно, будет содержать / символы, которые повредили бы синтаксис замены для sed, таким образом, необходимо будет использовать другой разделитель.

Принятие Ваших путей никогда не содержит ;s, попробуйте (после того, как поддержали Ваш текущий файл, конечно):

sed -i 's;^PATH=.*;PATH='"$PATH"';' .bashrc

Часть соответствия средств замены: соответствуйте строке, которая запускается с (^) строка PATH= и сопровождаемый любым символом (.) любое количество раз (*). Т.е. это будет соответствовать строкам, которые запускаются с PATH= полностью, но не строки, которые имеют PATH= где-нибудь в середине. .* важно, потому что Вы хотите заменить целую строку (попытка без него для наблюдения, что происходит).

Заключение в кавычки для получения $PATH замененный в замене необходимо для составления случаев где $PATH содержал бы пробельные символы.

Демонстрация:

$ foo=bar
$ echo hello | sed -e 's/hello/$foo/'
$foo

Огибающим Варом не заменяют в твердых кавычках. Таким образом, Вы получаете литерал $foo там. Теперь позвольте оболочке развернуть его путем обеспечения его из твердых кавычек:

$ foo=bar
$ echo hello | sed -e 's/hello/'$foo'/'
bar

Хорошо! Но это не безопасно:

$ foo="bar baz"
$ echo hello | sed -e 's/hello/'$foo'/'
sed: -e expression #1, char 11: unterminated `s' command

sed полученный два аргумента после -e выше: s/hello/bar и baz/, отдельно.Не очень. Для фиксации этого Вам нужно немного больше кавычек:

$ foo="bar baz"
$ echo hello | sed -e 's/hello/'"$foo"'/'
bar baz

Вставление переменной среды " кавычки - что-то, что необходимо в значительной степени всегда делать при передаче его как аргумента чему-то еще, иначе (принятие $IFS не был изменен), это будет разделено на пробеле.

4
27.01.2020, 22:01
  • 1
    ! Это работало точно как он, был запланирован! Если Вы не возражаете, у меня есть некоторые вопросы о синтаксисе: 1. Почему ^ необходим? 2. Почему должно быть 'и "вокруг $PATH? –  Zchpyvr 02.09.2012, 19:28
  • 2
    @Zchpyvr: добавленный несколько объяснений и примеров. Скажите мне, если это не разрешает его. –  Mat 02.09.2012, 19:46
  • 3
    Это было действительно полезно, я понимаю потребность в том синтаксисе теперь! Ваше редактирование является большим объяснением, и я хочу поблагодарить Вас за то, что занял время, чтобы объяснить это мне :) –  Zchpyvr 02.09.2012, 19:52

Теги

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