Это то, что вы получаете в csv
- если разделитель является частью поля, он получает цитаты. Это внезапно делает задачу разбора НАМНОГО труднее, потому что вы не можете просто разделить на делим.
К счастью, если perl
является опцией, имеется Текст:: Модуль CSV
, который обрабатывает этот случай:
#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV -> new ( { 'sep_char' => '|' } );
while ( my $row = $csv -> getline ( *STDIN ) ) {
print $row -> [1],"\n";
}
Возможно, это может конденсировать к встроенной/трубопроводной если вы предпочитаете - что-то вроде:
perl -MText::CSV -e 'print map { $_ -> [1] ."\n" } @{ Text::CSV -> new ( { 'sep_char' => '|' } ) -> getline_all ( *ARGV )};
-121--55122-
Если известно, что sompefile
является символьной ссылкой, можно явно указать полный путь к файлу следующим образом:
perl -pi.bak -e 's/foo/bar/' $ (somefile readlink)
Таким образом, исходная symlink остается нетронутой, поскольку замена теперь выполняется непосредственно с исходным файлом.
-121--35594-
Из perlsec :
...otherwise the only way to bypass the
tainting mechanism is by referencing subpatterns from a regular
expression match. Perl presumes that if you reference a substring
using $1, $2, etc., that you knew what you were doing when you wrote
the pattern.
Таким образом, предполагая, что вам нужно получить данные из внешнего сценария и действовать на него, вы должны проверить полученные данные. Я выйду на конечность и предположу, что ваш compareDate.sh
, как ожидается, вернет количество дней между данной датой и сегодняшним днем. Аналогично:
$ /bin/sh ./compareDate.sh "$date_tmp"
42
Затем его можно очистить следующим образом:
my $new = `/bin/sh ./compareDate.sh "$date_tmp"`; # TAINTED
if ($new =~ /^(\d+)$/) {
$new = $1; # Not tainted
} else {
die "Unexpected output from compareDate.sh!\n";
}
Код не просто распустил переменную (хотя это возможно, будучи чрезмерно разрешительным с нашими проверками), он подтвердил, что он имел то, что ожидалось. Если кто-то испортил его так, что он вместо этого содержал:
$ /bin/sh ./compareDate.sh "$date_tmp"
42; /bin/rm -rf *;
Тогда проверка не будет выполнена. Только цифры могут пройти, и мы не ожидаем, что они доставят нам какие-либо неприятности. Очевидно, что более сложные выходные данные могут потребовать большей проверки.
Когда я написал выше, я смотрел на код в первую очередь, и там $ date _ tmp
назначается литерал последовательности от кода и должен быть не ограничен. Но, как указывает jordanm, сообщение об ошибке говорит нам, что обратное выполнение вообще не происходит. Проблема заключается не в выходе оболочки, а в том, что некоторые более ранние повреждения мешают ей работать.
Единственной переменной в обратных ключах является $ date _ tmp
, поэтому аналогичная проверка должна выполняться между назначением и использованием в обратных ключах.
Самый простой способ войти в систему как root с помощью sudo
— это:
sudo - su
ввод пароля sudo
для входа в систему как root. (Между прочим, большинство дистрибутивов не назначают пароль root по умолчанию при установке ).
Как только вы вошли в систему как root, это так же просто, как назначить пароль для круга, выполнив:
passwd lap
, что должно позволить вам создать новый пароль для этого пользователя независимо от того, каким мог быть старый.
Однако, если у вас нет доступа к учетной записи с привилегиями sudo
, вы всегда можете загрузить машину в режиме одного пользователя -. Метод загрузки в однопользовательском режиме -зависит от того, какой дистрибутив вы используете в данный момент.
Это приведет вас прямо к корневой оболочке, где вы сможете изменить пароль для lap, как описано выше, что даст вам полный доступ к этой учетной записи.
Только привилегированный пользователь (, в основном root ), может сделать это или в другом месте может предоставить вам разрешения на запуск вещей в качестве пользователя «lap» без пароля, используя «sudo» для определенных задач.