Можно ли установить.deb из URL?
Есть ли способ установить пакет deb прямо с URL, используя оболочку? Что-то вроде
dpkg -i http://domain.com/path/to/package.deb
(Я знаю, что мог бы использовать wget и затем dpkg, мне просто интересно, есть ли что-то, что уже делает это)
14 ответов
Изменить: я не видел ваше предыдущее заявление о том, что вы могли бы знать, так что это немного неловко... Я оставлю это здесь для всех, кто хочет знать, как это сделать. Кроме того, предыдущая версия моего ответа не работала, но эта версия (за счет большей длины) работает:
TEMP_DEB="$(mktemp)" &&
wget -O "$TEMP_DEB" 'http://path.to/my.deb' &&
sudo dpkg -i "$TEMP_DEB"
rm -f "$TEMP_DEB"
Вам просто нужно изменить URL в начале. Это может быть псевдоним или записан как функция bash.
Я понимаю, что это связано с техническими проблемами и проблемами безопасности (вы не получаете автоматических обновлений, можно ли доверять источнику и т. Д.), Но это может сработать исключительно на основе принципа "могу ли я это сделать".
Это невозможно без создания временного файла. Обычно вы делаете это так
### Does not work
wget --quiet --output-document=- http://example.com/path/to/package.deb | dpkg --install -
или, может быть
### Does not work
dpkg --install <(wget --quiet --output-document=- http://example.com/path/to/package.deb)
но dpkg использует mmap для доступа к файлу, поэтому ни один из них не работает. Об этом есть сообщение об ошибке: # 367297
Вы можете попробовать с curl
,
Чтобы загрузить файл в текущую папку и установить из локального файла:
curl -sLO https://apt.puppetlabs.com/puppetlabs-release-precise.deb && sudo dpkg -i puppetlabs-release-precise.deb
или загрузить в /var/cache/apt/archives/
и установить оттуда:
curl -sL -o/var/cache/apt/archives/puppetlabs-release-precise.deb https://apt.puppetlabs.com/puppetlabs-release-precise.deb && sudo dpkg -i /var/cache/apt/archives/puppetlabs-release-precise.deb
Самый быстрый способ, как это. Нажмите, чтобы начать установку затвора ,
URL, используемые для нажатия на имя:
http://packages.ubuntu.com/shutter
... и нажмите на иконку:
http://apt.ubuntu.com/p/shutter
И да, вам нужен Ubuntu Software Center для завершения установки.DEB. В противном случае вам придется выполнить установку из Nautilus или из командной строки.
Полный текст, используемый для этого, предназначен только для Ask Ubuntu, поэтому вам нужно переформатировать его в якорь:
[shutter](http://packages.ubuntu.com/shutter) [![Install shutter]
(https://hostmar.co/software-small)](http://apt.ubuntu.com/p/shutter)
Больше информации можно найти на странице apturl wiki:
1 пакет:
a href="apt:package"
Комплектация нескольких пакетов:
a href="apt:package1,package2,package3"
Включение репозиториев:
apturl apt:freevial?section=universe
Поэтому, если программное обеспечение отсутствует в репозитории по умолчанию, вы должны добавить в него раздел =. В противном случае вы не можете использовать этот метод, и пользователь должен загрузить его и установить самостоятельно.
Если у вас установлен (или установлен) Ansible:
ansible -m apt -a deb=http://domain.com/path/to/package.deb localhost
У меня на самом деле есть скрипт, который делает что-то похожее:
Просто скопируйте и вставьте этот скрипт в ~/bin
(создайте эту папку, если она не существует):
#!/bin/bash
# ~/bin/dpkg
COUNT=0
for i in $@; do
echo $i | grep http 2>&1 > /dev/null
if [ $? == 0 ]; then
URL="$URL $i"
continue
fi
PASSTODPKG="$PASSTODPKG $i"
done
#Remove beginning and trailing space
URL=$(echo $URL | sed -e 's/^ //g' -e 's/ $//g')
if [ ! -z $URL ]; then
mkdir /tmp/debs
cd /tmp/debs
for i in $URL; do
wget "$i"
done
dpkg $PASSTODPKG /tmp/debs/*.deb
else
dpkg $PASSTODPKG
fi
Затем добавьте это к последней строке ~/.bashrc
PATH="~/bin:$PATH"
Скрипт это просто обёртка для dpkg
, Линия в ~/.bashrc
файл рассказывает bash
что всякий раз, когда вы печатаете dpkg
будет работать ~/bin/dpkg
(сценарий), а не /usr/bin/dpkg
,
Скрипт просто передаст аргументы dpkg
если не указан URL Сценарий также поддерживает несколько URL-адресов. Вот несколько примеров, которые будут работать:
sudo dpkg -i http://www.example.com/file1.deb
sudo dpkg -i http://www.example.com/file1.deb http://www.example.com/file2.deb
sudo dpkg -i http://www.example.com/file1.deb existing.deb http://www.example.com/file2.deb
sudo dpkg -i existing.deb
lynx
может позвонить dpkg
(или Центр программного обеспечения, если дисплей доступен) и предложите установить загруженный пакет для вас. Например, используя:
lynx http://archive.ubuntu.com/ubuntu/pool/main/z/zsh/
И скачать один из .deb
файлы, отображается следующее приглашение:
Info for debian package '/tmp/user/1000/L11127-6774TMP.udeb':
new debian package, version 2.0.
size 2545218 bytes: control archive=5830 bytes.
857 bytes, 21 lines control
14682 bytes, 169 lines md5sums
225 bytes, 20 lines * postinst #!/bin/sh
Package: zsh-doc
Source: zsh
Version: 5.1.1-1ubuntu1
Architecture: all
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Installed-Size: 5291
Depends: zsh-common (= 5.1.1-1ubuntu1)
Section: doc
Priority: optional
Homepage: http://www.zsh.org/
Description: zsh documentation - info/HTML format
Zsh is a UNIX command interpreter (shell) usable as an
interactive login shell and as a shell script command
processor. Of the standard shells, zsh most closely resembles
ksh but includes many enhancements. Zsh has command-line editing,
built-in spelling correction, programmable command completion,
shell functions (with autoloading), a history mechanism, and a
host of other features.
.
This contains the documentation in GNU info and HTML formats.
Original-Maintainer: Debian Zsh Maintainers <pkg-zsh-devel@lists.alioth.debian.org>
Do you wish to:
- I)nstall the package now,
- S)ave it to a file, or
- Q)uit now
Your choice (I/S/Q)? I
Installation of Debian packages needs to be done as root.
Enter command used to become root (default=sudo):
Installing package...
[sudo] password for bro3886:
(Reading database ... 756955 files and directories currently installed.)
Preparing to unpack .../user/1000/L11127-6774TMP.udeb ...
Unpacking zsh-doc (5.1.1-1ubuntu1) over (5.0.5-4ubuntu1~ubuntu14.04.1) ...
dpkg: dependency problems prevent configuration of zsh-doc:
zsh-doc depends on zsh-common (= 5.1.1-1ubuntu1); however:
Version of zsh-common on system is 5.0.5-4ubuntu1~ubuntu14.04.1.
dpkg: error processing package zsh-doc (--install):
dependency problems - leaving unconfigured
Processing triggers for doc-base (0.10.5) ...
Processing 1 changed doc-base file...
Processing triggers for install-info (5.2.0.dfsg.1-2) ...
Errors were encountered while processing:
zsh-doc
Done. Press <return> to continue:
(Может быть, я не должен пытаться устанавливать случайные пакеты из Интернета.)
Этот однострочный ответ, основанный на SO-ответе, сработал для меня в Ubuntu 15.04, чтобы определить последнюю версию атома на github для моей среды (64-битную Ubuntu) и затем установить его:
sudo dpkg -i $(curl -w "%{filename_effective}" -LO $(curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4))
Если вы сделаете это в директории tmp, файл deb будет очищаться всякий раз, когда вы очищаете папку tmp. В противном случае вы можете вручную удалить пакет deb, если вам нужно место на диске.
Я знаю, что прошло много времени с тех пор, как на этот вопрос был дан ответ / опубликовано, но вот мой скромный вклад:
#!/bin/bash
dir="/tmp/dpkg-get"
url="$1"
file="${url##*/}"
if [ "$EUID" -ne 0 ]
then
echo "Please run as root"
exit
fi
[ -d $dir ] || mkdir $dir
wget -q --show-progress -O "$dir/$file" $url && \
dpkg -i "$dir/$file"
Как установить dpkg-get
из Pastebin с помощью одной команды:
sudo bash -c "wget http://pastebin.com/raw/GWu7qLwK -O- | tr -d '\r' > /usr/local/bin/dpkg-get && \
chmod a+x /usr/local/bin/dpkg-get"
Как его использовать (например, для установки PowerShell 6 alpha):
sudo dpkg-get https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.10/powershell_6.0.0-alpha.10-1ubuntu1.16.04.1_amd64.deb
И это все.
Я знаю, что это не идеально, но это просто и работает.
Не забудьте быть осторожным с тем, что вы устанавливаете и откуда вы его загружаете.
Однострочное решение для загрузки, установки и удаления пакета после установки:
deb=$(curl -w "%{filename_effective}" -LO https://nginx.org/packages/ubuntu/pool/nginx/n/nginx/nginx_1.20.0-1~focal_amd64.deb) && dpkg -i $deb && rm $deb && unset deb
Вы можете добавить его к /etc/bash.bashrc
как следует (это обновление от сценария Чена):
'dpkg-url'() {
COUNT=0
for package in "${urls[@]}"; do
if [[ $package = *http* ]]; then
urls+=("$package")
fi
dpkg_url="$dpkg_url "$package""
done
# Remove beginning and trailing spaces #
url=$(echo "$url" | sed -e 's/^ //g' -e 's/ $//g')
if [[ ! -z "$url" ]]; then
directory=$(mktemp -d);
trap 'rm -rf "$directory"' EXIT
cd "$directory" || exit
for package in "$url"; do
wget ""$package""
done
dpkg $dpkg_url "$directory"/*.deb
else
dpkg $dpkg_url
fi
}
Хотя я не понимаю, почему я получаю эту ошибку при вызове следующим образом:
dpkg-url -i http://downloads.sourceforge.net/ldview/ldview-4.2-beta1.x64.deb
dpkg: error: need an action option
Type dpkg --help for help about installing and deinstalling packages [*];
Use `dselect' or `aptitude' for user-friendly package management;
Type dpkg -Dhelp for a list of dpkg debug flag values;
Type dpkg --force-help for a list of forcing options;
Type dpkg-deb --help for help about manipulating *.deb files;
Options marked [*] produce a lot of output - pipe it through `less' or `more' !
Просто подумал, что я дам свои два цента на это. Вы можете установить пакет из URL, используя следующую команду:
wget insert_url_here
После того, как он был загружен, вам нужно запустить команду dpkg от имени суперпользователя:sudo dpkg -i insert_file_name_here
Затем просто следуйте инструкциям, которые будут представлены в терминале.
Эта команда ожидает ввода одного URL-адреса (три щелчка мыши, чтобы выбрать все):
TMP_DEB="$(mktemp)" && read -p "Enter the URL of the .deb file: " FILE_URL && wget -O "$TMP_DEB" "$FILE_URL" && sudo dpkg -i "$TMP_DEB" ; rm -f "$TEMP_DEB" ; unset TMP_DEB FILE_URL
Это моя версия сценария dpkgi (dpkg-installer) (удаленно и локально), основанная на других ответах:
#!/bin/bash
# Script by Breno Maia (bremaya) <https://www.github.com/bremaya> <bremaya@gmail.com>
# Check if the user is root
if [ "$(id -u)" != "0" ]; then
echo "dpkg: error: the requested operation requires superuser privileges" >&2
exit 1
fi
URL=""
PASSTODPKG=()
cleanup() {
rm -rf "$TMPDIR" # Remove the entire temporary directory
}
TMPDIR=$(mktemp -d) # Create a unique temporary directory
for i in "$@"; do
if [[ "$i" == http* ]]; then
URL="$URL $i"
else
PASSTODPKG+=( "$i")
fi
done
# Remove spaces at the beginning and end of the URL variable
URL=$(echo "$URL" | sed -e 's/^ //' -e 's/ $//')
if [ -n "$URL" ]; then
cd "$TMPDIR"
for i in $URL; do
wget -P "$TMPDIR" "$i"
done
fi
if [ ${#PASSTODPKG[@]} -gt 0 ]; then
dpkg -i "${PASSTODPKG[@]}"
fi
if [ -n "$URL" ]; then
cd "$TMPDIR"
dpkg -i ./*.deb
cleanup
fi
Функциональная версия:
# Add this function to your .bashrc file to install local and remote packages
dpkgi() {
# Check if the user is root
if [ "$(id -u)" != "0" ]; then
echo "dpkg: error: the requested operation requires superuser privileges" >&2
return 1
fi
URL=""
PASSTODPKG=()
cleanup() {
rm -rf "$TMPDIR" # Remove the entire temporary directory
}
TMPDIR=$(mktemp -d) # Create a unique temporary directory
for i in "$@"; do
if [[ "$i" == http* ]]; then
URL="$URL $i"
else
PASSTODPKG+=( "$i")
fi
done
# Remove spaces at the beginning and end of the URL variable
URL=$(echo "$URL" | sed -e 's/^ //' -e 's/ $//')
if [ -n "$URL" ]; then
cd "$TMPDIR"
for i in $URL; do
wget -P "$TMPDIR" "$i"
done
fi
if [ ${#PASSTODPKG[@]} -gt 0 ]; then
dpkg -i "${PASSTODPKG[@]}"
fi
if [ -n "$URL" ]; then
cd "$TMPDIR"
dpkg -i ./*.deb
cleanup
fi
}
Я просто завернул ответ Oli в функцию bash, которую можно добавить к вашему
.<shell>rc
файл:
function dpkg_r() {
local tmp_deb="$(mktemp)"
local src_url=$1
local args=${@:2}
wget -O $tmp_deb $src_url &&
sudo dpkg -i $tmp_deb $args &&
{ rm -f $tmp_deb; true; } || # commands above succeeded, remove tmp file
{ rm -f $tmp_deb; false; } # commands above failed, remove tmp file anyway
}
Назовите его как хотите. Я назвал это как
dpkg_r
где r означает удаленный там