Если вы знаете пароль root, вы можете запустить su -s / bin / bash
, чтобы получить оболочку root bash.
sudo -s / bin / bash
тоже должно работать, и в зависимости от того, как настроено sudo
, вам нужно будет знать только свой собственный пароль или не знать пароля.
Затем вы можете использовать chsh -s / bin / bash
, чтобы снова изменить командную оболочку root на bash.
Кстати, как правило, менять оболочку root в любой системе UNIX - плохая идея. Многие задания cron и т. Д. Зависят от того, является ли корневая оболочка корневой оболочкой по умолчанию для этой ОС, и БУДЕТ сломаться, если вы ее измените.
Если вы используете достаточно свежую версию Debian или другого дистрибутива с использованием apt, вы можете использовать для этого apt-get
. Поместите следующие настройки в файл с именем apt-get.conf
, чтобы он не использовался
Dir::Etc::main ".";
Dir::Etc::Parts "./apt.conf.d";
Dir::Etc::sourcelist "./sources.list";
Dir::Etc::sourceparts "./sources.list.d";
Dir::State "./apt-tmp";
Dir::State::status "./apt-tmp/status";
Dir::Cache "./apt-tmp";
Подготовьте некоторые необходимые файлы:
mkdir -p apt-tmp/lists/partial
touch apt-tmp/status
apt-get -c apt.conf update >/dev/null
Затем вы можете загружать пакеты в текущий каталог с помощью
apt-get -c apt.conf download $packages
Со старым версии apt-get
, в которых отсутствует команда загрузить
, вы можете использовать
apt-get -c apt.conf install -d $packages
для загрузки пакетов и их зависимостей в apt-tmp / archives
.
Все инструменты, которые я могу найти, используют локальную информацию apt
(и, следовательно, репозитории в / etc / apt / sources. list
и т. д., как определено при последнем запуске apt-get update
). Однако интерпретировать формат репозитория не так уж сложно.
Сохраните
#!/bin/sh
# Downloads a package from a repository
# dlpkg repo distro suite arch package
for arch in all "${4}"; do
curl "${1}/dists/${2}/${3}/binary-${arch}/Packages.xz" | xz -d | "$(dirname $0)/pkgfilename" -v "PACKAGE=${5}" | while read filename; do
curl -O "${1}/${filename}"
done
done
как dlpkg
и
#!/usr/bin/awk -f
/Package:/ {
package = $2
}
package == PACKAGE && /Filename:/ {
print $2
}
как pkgfilename
, сделайте их исполняемыми, а затем вы можете загрузить пакет, запустив
./dlpkg <repository URL> <distribution> <suite> <architecture> <package>
, например
./dlpkg http://ftp.fr.debian.org/debian unstable main amd64 libc6
Если вам нужно обрабатывать репозитории, файлы пакетов
которых не находятся в каноническом порядке ( Пакет
до Имя файла
), вы можете вместо этого использовать следующий сценарий AWK:
#!/usr/bin/awk -f
BEGIN {
filename = ""
}
/^$/ {
filename = ""
stanza = 0
}
/Package:/ {
if ($2 == PACKAGE) {
stanza = 1
if (filename != "") {
print filename
stanza = 0
}
}
}
/Filename:/ {
filename = $2
if (stanza == 1) {
print filename
filename = ""
}
}
Здесь нет обработки ошибок, это оставлено в качестве упражнения для читателя. Также нет проверки подписи ...
Я не думаю, что то, что вы пытаетесь достичь, соответствует идее наличия репозиториев как таковых. Идея в том, что вам нужно будет добавить репо в реполист, а затем установить из него и т. Д.
Можно загрузить пакет вручную (я делаю это довольно часто с пакетами RPM для Fedora) и установить пакет вручную штатными средствами (в моем случае dnf
).
Обычно я использую URL из /etc/yum.repos.d/
, а затем просто просматриваю в браузере и загружаю с помощью wget
. Это должно быть аналогично пакетам DEB.
Итак,
wget
Если репо доступно напрямую в Интернете (что я не понимаю, почему нет), dnf
понимает, когда ему дается URL-адрес для пакета RPM. Я уверен, что эквивалентный инструмент Debian будет делать то же самое. Так что вы сэкономите, загрузив пакет в браузере или с помощью wget
.
Насколько я понимаю, вас интересует только загрузка пакетов. Поэтому в этом случае я думаю, что использование простого wget
- лучший способ и т. Д.
Ну, может быть, этот скрипт является решением для ваших нужд:
#!/bin/bash U="$1" FILE="$2" [[ -z "$U" ]] && echo -e "Usage: $0 repo-url [file to download]\nwithout give \"file to download\" this script will list the files inside the repo\n"; for i in $(curl -l "$U" 2>/dev/null|grep -i 'href='|sed -e 's/.*href=//g' -e 's/>.*//g' -e 's/"//g'|grep -v '/$'|grep "$FILE") do if [[ -z "$FILE" ]] then echo "FILE: $i" else echo "Download file: $i" curl -q "${U}/${i}" --output "$i" 2>/dev/null ls -la "$i" fi done