Предполагая, что вы используете OpenSSH, вы можете настроить свой файл ~/.ssh/config
для каждого, тогда вам также не нужно будет указывать пользователя, вы можете создать свое собственное имя:
host host1
User testuser
IdentityFile ~/.ssh/id_rsa-test
тогда, когда вы сделаете ssh host1
, это будет сделано автоматически, или, поскольку вы будете использовать host1
как другие пользователи, вы также можете сделать
host test-host1
User testuser
IdentityFile ~/.ssh/id_rsa-test
Hostname host1
затем выполнитеssh test-host1
и вы можете сделать то же самое для любого желаемого хоста.
Любой хост, который не соответствует записи в файле конфигурации ssh _(5 ), будет использовать поведение по умолчанию --или использовать значения по умолчанию, указанные в конфигурации ssh _по адресу глобальная настройка, т. е. не внутри хост-блока
ssh _config не поддерживает сопоставление имен пользователей, но вы можете написать сценарий оболочки, чтобы определить это для вас. Вот хрупкий пример в bash, который предполагает, что ваше имя пользователя/хост всегда является первым аргументом, и сломается, если это не так:
ssh() {
if [[ "$1" =~ ^testuser@ ]]; then
command ssh -i ~/.ssh/id_rsa-test "$@"
else
command ssh "$@"
fi
}
Да, он связывается сам с собой при инициализации. Технически динамический компоновщик не нуждается в разрешении и перемещении объекта для самого себя, поскольку он полностью разрешается, как -, но он определяет символы и должен заботиться о них при разрешении бинарного файла, который он «интерпретирует», и эти символы обновляются, чтобы указывать на их реализации в загруженных библиотеках. В частности, это влияет на malloc
— компоновщик имеет встроенную минимальную версию -с соответствующим символом, но она заменяется версией библиотеки C после ее загрузки и перемещения (или даже промежуточной версией, если есть является одним ), с некоторыми предосторожностями, чтобы гарантировать, что это не произойдет в момент, когда это может привести к поломке компоновщика.
Кровавые подробности в rtld.c
, в функции dl_main
.
Обратите внимание, однако, что ld.so
не имеет внешних зависимостей. Вы можете увидеть символы, связанные с nm -D
; ни один из них не определен.
Справочная страница ссылается только на записи непосредственно под /lib
, , то есть/lib/ld.so
(динамический компоновщик libc 5, который поддерживаетa.out
)и/lib*/ld-linux*.so*
(динамический компоновщик libc 6, который поддерживает ELF ). Страница руководства очень специфична, а ld.so
нет ld-2.28.so
.
Динамический компоновщик, присутствующий в подавляющем большинстве современных систем, не поддерживает a.out
.
file
и ldd
сообщают о разных вещах для динамического компоновщика, потому что у них разные определения того, что представляет собой статически -связанный двоичный файл. Для ldd
двоичный файл считается статически связанным, если он не содержит DT_NEEDED
символов, , т. е. не содержит неопределенных символов. Для file
двоичный файл ELF статически компонуется, если он не имеет раздела PT_DYNAMIC
(, это изменится в выпуске file
после 5.37; теперь он использует наличие секции PT_INTERP
в качестве индикатора динамически -связанного двоичного файла, что соответствует комментарию в коде ).
В динамическом компоновщике библиотеки C GNU нет символов DT_NEEDED
, но есть раздел PT_DYNAMIC
(, поскольку технически это общая библиотека ). В результате ldd
(, который является динамическим компоновщиком, )указывает, что он статически связан, а file
указывает, что он динамически связан. В нем нет раздела PT_INTERP
, поэтому в следующем выпуске file
также будет указано, что он статически связан.
$ ldd /lib64/ld-linux-x86-64.so.2
statically linked
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(с file
5,35)
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(с текущей -разрабатываемой версиейfile
).
Я подозреваю, что программа file
ошибается в том, что динамически компоновщик/загрузчик сам динамически компонуется. Программа ldd
не согласна. По крайней мере, не в моей системе (Debian Stretch):
ldd /lib/x86_64-linux-gnu/ld-2.24.so
statically linked
man ld.so
также читается как:«ld -linux.so *обрабатывает ELF» . Кстати, в вашей системе (и в моей тоже )оба являются символическими ссылками на один и тот же двоичный файл, который, как я понимаю, способен обрабатывать как ELF, так и (старый устаревший формат )a.out.