perl -MFatal='open,close' -ali -ne '
BEGIN{
open FILEC, ">", "FileC.out";
open FILED, ">", "FileD.out";
}
if ( @ARGV ) { # FileB readin
if ( $. == 1 ) {
push @names, @F;
print FILED $_;
} else {
push @A, join $/, @F;
push @B, $_;
}
print;
} else { # FileA readin
if ( $. == 1 ) {
print FILEC $_;
print;
@remap =
map {
my $n = $names[$_];
grep { $n eq $F[$_] } 0.. $#F;
} 0..$#names;
} else {
my $n = join $/, @F[@remap];
if ( my($id) = grep { $n eq $A[$_] } 0.. $#A ) {
push @IDs, $id;
print FILEC $_;
} else {
print;
}
}
}
eof and $. = 0;
END{
splice(@B, $_, 1) for @IDs;
@B and print FILED $_ for @B;
close $_ for *FILEC, *FILED;
}
' FileB FileA
После этого создаются файлы "FileC.out" и "FileD.out". FileA изменяется, а FileB остается неизменным.
Поток точно такой же, как и в предыдущем запросе, добавлена полевая обработка.
Вам необходимо обратить внимание на другое ограничение, наложенное на каталог, используемый какChrootDirectory
:Все компоненты пути должны принадлежать root -каталогам, недоступным для записи другим пользователям или группам. Если пользователю необходимо иметь возможность записи в свой собственный домашний каталог внутри chroot, то домашний каталог не должен совпадать с ChrootDirectory
.
Историческая справка:
Поддержка chroot в OpenSSH возникла как отдельный патч, и даже после того, как он был интегрирован в основной дистрибутив OpenSSH, точные требования, предъявляемые к каталогу, используемому в качестве ChrootDirectory, изменились в разных версиях OpenSSH. В более новых версиях, как правило, предъявляются более строгие требования, чем в старых, в ответ на обнаруженные уязвимости безопасности в предыдущих установках -.
Кроме того, требование иметь один и тот же путь к домашнему каталогу, применимый как внутри, так и вне chroot, явно неоптимально, и в некоторых дистрибутивах применяются исправления для изменения поведения. К сожалению, не все такие исправления в прошлом включали обновления справочных страниц и другой соответствующей документации.
Но чтобы удовлетворить требования, как написано, вы могли бы сделать это, например:
mkdir -p /jail/username/home
# First, the chroot directory:
chown root:root /jail/username
chmod 755 /jail/username
# Then, the user's home directory:
chown username: /jail/username/home
chmod 750 /jail/username/home
usermod -d /jail/username/home username
# And here's the magic:
cd /jail/username
ln -s. jail # this would normally be a silly thing to do
ln -s. username # but with chroot it can be useful
Теперь мы можем установить ChrootDirectory /jail/%u
.
При просмотре вне chroot домашний каталог пользователя будет /jail/username/home
. Немного отклонение от обычного соглашения об именах, но в остальном ничего особенного.
И внутри chroot один и тот же путь к домашнему каталогу действительно будет ссылаться на /jail/username/jail/username/home
... но вы видели эти две глупые символические ссылки выше? Разыменуйте их, и вы получите /jail/username/././home
, что в конечном итоге будет точно таким же, как /jail/username/home
. Таким образом, один и тот же путь указывает на одно и то же место как внутри, так и снаружи chroot.
Пользователь внутри chroot увидит свой домашний каталог как /jail/username/home
= /././home
= /home
и сможет использовать его как обычно.Они смогут видеть на один уровень выше своего домашнего каталога, /
, но писать туда сможет только root.
Это также позволит вести журнал в стиле syslog -:, вы можете создать корневой -собственный каталог /jail/username/dev
и указать rsyslog
создать дополнительный сокет в стиле/dev/log
-в /jail/username/dev/log
... и теперь chroot-пользователь может создавать сообщения журнала и обрабатывать их обычной подсистемой syslog.
Это ни в коем случае не единственный способ упорядочить окружение chroot, хотя описанная выше -настройка стиля делает домашний каталог пользователя обычным (= без символических ссылок и других странностей ), насколько это возможно для процессов вне среды chroot, если это важно.
Если вместо этого вы хотите, чтобы chroot был максимально стерильным для заключенного в тюрьму пользователя, вы можете сделать это вместо этого:
mkdir -p /jail/username/username
# Prepare the chroot directory
chown root:root /jail /jail/username
chmod 755 /jail /jail/username
# Prepare the user's actual home directory
chown username: /jail/username/username
chmod 750 /jail/username/username
# Make it usable outside the chroot too
ln -s /jail/username/username /username
# And now it can be assigned to the user.
usermod -d /username username
Снова устанавливаем ChrootDirectory /jail/%u
.
Вне chroot /username
будет символической ссылкой, указывающей на /jail/username/username
, поэтому домашний каталог пользователя будет действительным.
Для chroot-процессов /username
будет обычным каталогом, который можно использовать в качестве домашнего каталога пользователя.
Да, настоящие пути немного повторяются, а символические ссылки будут загромождать корневую директорию системы, но в среде chroot не будет ничего постороннего.
И если единственное то, что нужно chroot-пользователю, — это SFTP, принятый ответ на этот вопрос описывает еще более простой способ.