Сервер Hyper-V является встроенным гипервизором без любого графического UI; в этом это очень похоже на установку Ядра Сервера Windows Server 2008, или к серверу ESX VMware.
Можно только сделать управление командной строки от консоли, и гости доступны только удаленно.
Вы правы, если необходимо выполнить VMs и получить доступ к ним от той же консоли сервера, Вам нужна полная установка Windows Server 2008 с ролью Hyper-V.
Мне сказали, что официальный способ делать то, что я ищу, - это Python:
from rpmUtils.miscutils import splitFilename
(n, v, r, e, a) = splitFilename(filename)
Я написал короткую программу Python, которая делает то, что мне нужно. Я предложу скрипт в проект rpmdev для включения.
Можно использовать dnf info
. Вот сценарий Bash в качестве примера, чтобы получить значения и установить как переменная:
function dnfinfo() {
dnf info "$(echo "${1}" | sed 's/\.rpm$//g')"
}
function splitname() {
eval $(
dnfinfo "${1}" | \
grep "^Arch\|^Name\|^Release\|^Version" | \
sort | \
awk -F": " {'print "\""$2"\""'} | \
tr "\n" " " | \
awk {'print "xarch="$1"~xname="$2"~xrel="$3"~xver="$4'} | \
tr "~" "\n"
)
}
splitname "tcpdump-4.9.2-5.el8.x86_64.rpm"
echo "${xname} ${xver} ${xrel} ${xarch}"
Это даст результат, даже если пакет не будет установлен.
You don't need to do any of this; RPM has a query format argument which will let you specify exactly the data you want to receive. It will even output without line endings if you don't specify them.
For instance:
rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -q coreutils
rpm --queryformat "The version of %{NAME} is %{VERSION}\n" -q coreutils
rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -qp file.rpm
The complete list of variables you can use can be obtained with:
rpm --querytags
Note that in the case of RELEASE
, output like 84.el6
is normal and expected, since this is actually how RPM packages are versioned when packaged by or for a distribution.
Я разработал регулярные выражения, которые соответствуют всем данным, с которыми я смог их протестировать. Мне пришлось использовать смесь жадных и нежадных спичек. Тем не менее, вот мои версии на perl и python:
Perl:
#! /usr/bin/perl
foreach (@ARGV) {
($path, $name, $version, $release, $platform,
@junk) = m#(.*/)*(.*)-(.*)-(.*?)\.(.*)(\.rpm)#;
$verrel = $version . '-' . $release;
print join("\t", $path, $name, $verrel, $version, $rev, $platform), "\n";
}
Python:
#! /usr/bin/python
import sys
import re
for x in sys.argv[1:]:
m = re.search(r'(.*/)*(.*)-(.*)-(.*?)\.(.*)(\.rpm)', x)
if m:
(path, name, version, release, platform, _) = m.groups()
path = path or ''
verrel = version + '-' + release
print "\t".join([path, name, verrel, version, release, platform])
else:
sys.stderr.write('ERROR: Invalid name: %s\n' % x)
sys.exit(1)
Я бы предпочел использовать регулярное выражение из проекта RPM. Тот, который я изобрел выше, должен сделать пока.
Используйте параметры -q --queryformat из rpm, как было сказано ранее, если вы хотите сделать это с неустановленным пакетом, вы можете указать rpm с помощью -p
, например:
rpm -q -p ./Downloads/polysh-0.4-1.noarch.rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}\n"
polysh 0.4 1 noarch
например,
$ ls ./Downloads/*.rpm
./Downloads/adobe-release-x86_64-1.0-1.noarch.rpm
./Downloads/nautilus-dropbox-1.6.0-1.fedora.x86_64.rpm
./Downloads/playonlinux-yum-4-1.noarch.rpm
./Downloads/skype-4.2.0.11-fedora.i586.rpm
./Downloads/dbview-1.0.4-2.1.x86_64.rpm
./Downloads/openmotif22-libs-2.2.4-192.1.3.x86_64.rpm
./Downloads/polysh-0.4-1.noarch.rpm
дает мне
adobe-release-x86_64 1.0 1 noarch
dbview 1.0.4 2.1 x86_64
nautilus-dropbox 1.6.0 1.fc10 x86_64
openmotif22-libs 2.2.4 192.1.3 x86_64
playonlinux-yum 4 1 noarch
polysh 0.4 1 noarch
skype 4.2.0.11 fc16 i586
, поэтому просто разделение имени файла неверно!
for filename in """<paste list here>""".split():
print splitFilename(filename)
('./Downloads/adobe-release-x86_64', '1.0', '1', '', 'noarch')
('./Downloads/nautilus-dropbox', '1.6.0', '1.fedora', '', 'x86_64')
('./Downloads/playonlinux-yum', '4', '1', '', 'noarch')
('./Downloads/skype', '4.2.0.11', 'fedora', '', 'i586')
('./Downloads/dbview', '1.0.4', '2.1', '', 'x86_64')
('./Downloads/openmotif22-libs', '2.2.4', '192.1.3', '', 'x86_64')
('./Downloads/polysh', '0.4', '1', '', 'noarch')
поэтому обратите внимание , это неправильная информация об оборотах в минуту,
например, 1.fedora
на самом деле равно 1.fc10
в оборотах.
Если вы знакомы с регулярными выражениями и / или Perl, это довольно просто.
ls | head | perl -p -e 'm#([^\-]+?)-(.*).rpm$#; print "$1 $2\n";$_=""'
или только регулярное выражение:
m#([^\-]+?)-(.*).rpm$#
Если вы разделите его, это:
[^ \ -] +
(экранирован, потому что дефис имеет особое значение в группах символов) [^ \ -] +?
([^ \ -] +?)
([^ \ -] +?) -
.rpm
): ([^ \ -] +?) - (. *). rpm $
(доллар означает «конец строки») m # ([^ \ -] +?) - (. *). rpm $ #
Готово! Просто поместите обе части в переменные $ 1
и $ 2
Комментарий к первому однострочному запросу:
Я находился в каталоге со многими файлами rpm, отсюда ls
.
perl -p
эквивалентен;
perl -e 'while(<STDIN>){ chomp($_); [YOUR CODE HERE] ; print($_); }'
Это объясняет, что мне пришлось поместить нулевую строку в $ _
, чтобы Perl не печатал строку обратно после того, как я извлек и напечатал его на заказ. Обратите внимание, что я мог использовать замены, чтобы избежать этого небольшого «взлома».
Rpm-файлы могут иметь некоторые забавные имена файлов в экстремальных случаях, но обычно вы можете разделить NVR на дефисы. Уловка заключается в том, что часть N (имя) NVR может содержать дефисы и подчеркивания, но в V(версии) и R(версии) гарантированно не будет никаких посторонних дефисов. Поэтому вы можете начать с обрезки части VR для получения имени.
$ RPM=/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial-2.8-3.el6.x86_64.rpm
$ echo ${RPM%-*-*}
/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial
Основываясь на этом, вы можете изолировать часть Version and Release.
echo ${RPM#${RPM%-*-*}-*}
2.8-3.el6.x86_64.rpm
Просто разделите дефис еще раз, чтобы изолировать нужную вам часть. И, очевидно, очистите строки расширения архива и rpm-файла, которые являются заданными. Просто даю вам представление о том, как к этому можно подойти в bash.
ИМХО, самый простой способ оболочки:
ls | rev | cut -d/ -f1 | cut -d- -f3- | rev
То есть: перевернуть каждую строку, используя косую черту, вырезать только первую часть ( emanelif ), затем, используя дефис, вырезать все, кроме первых двух части (например, оставьте ESAELER , включая emanelif eth fo tser и NOISREV ) и переверните enil обратно.
В вашем примере файл:
$ cat /tmp/packages.txt | rev | cut -d/ -f1 | cut -d- -f3- | rev
emacs-mercurial
emacs-mercurial-el
mercurial
mercurial-hgk
python-redis
redis
sei_dnsmaster
$
Чтобы получить другие части, выполните упражнение по чтению cut (1) .
Безусловно, самый простой способ — создать регулярное выражение, которое будет делать одно, работать ;-) Регулярное выражение подстроки на диске.:
s/^(?:\w{1})(?:-?\w+?\S+?-?){1,}?(\d+[\:|\.]\d+\S+)/$1/g
Это регулярное выражение подстроки в Perl!
Пример:
echo bonnie-++sdsdsœ@@œ=gcc-++++_sded-sdsdsd-fcc-gcc-c++-4.8.5-36.0.1.el7_6.2.x86_64|perl -pe 's/^(?:\w{1})(?:-?\w+?\S+?-?){1,}?(\d+[\:|\.]\d+\S+)/$1/g'
Вывод:
4.8.5-36.0.1.el7_6.2.x86_64
Так что версия правильная. Регулярное выражение охватывает 99,9% имен пакетов RPM в одной строке ;-)
Краткое объяснение: (?:) Незахватывающая группа (мне не нужна эта часть -> использовать для скорости. Всегда)
\w+: Символы слова (включая _)
? Необязательное совпадение
\S+: символ без пробела
{1,} Не-захват-соответствие всей группе 1 или более
Worx для вас и для меня!