Изменение argv[0] из командной строки

Самое простое решение (, если жесткий диск меньше, чем SDD, а SDD можно подключить к компьютеру ), заключается в:

  1. загрузиться с флешки -дистрибутив. Это позволяет избежать открытия временных файлов на жестком диске.
  2. Скопируйте с помощью dd весь жесткий диск на SDD:

    dd if=/dev/HDD of=/dev/SDD bs=4k
    

    Конечно, HDD и SDD должны быть заменены правильными именами для целых дисков, например /dev/sdaили /dev/sdd(, а не разделов/dev/sda1).

  3. Замените HDD на SDD в компьютере.

  4. Загрузитесь как всегда.

Единственная проблема заключается в том, что UUID обоих аппаратных средств будут одинаковыми и могут помешать вам подключить разделы жесткого диска в качестве дополнительного диска. Это можно будет исправить позже, если потребуется.

1
16.01.2020, 18:12
3 ответа

При запуске оболочки с использованием опции -cдля запуска сценария в строке -первый аргумент будет помещен в$0:

$ sh -c 'printf "0: %s\n" "$0"; printf "Other: %s\n" "$@"'  hello there how are you
0: hello
Other: there
Other: how
Other: are
Other: you

В bashприсвоение BASH_ARGV0изменяет текущее значение оболочки $0:

$ printf '%s\n' "$0"
/usr/local/bin/bash
$ BASH_ARGV0="hello"
$ printf '%s\n' "$0"
hello

(но это не меняет имя процесса в моей системе)

Используя set, вы измените другие аргументы:

$ printf '%s\n' "$@"

$ set -- A B C
$ printf '%s\n' "$@"
A
B
C
3
27.01.2020, 23:29

Символической ссылки может быть достаточно для большинства систем:

~$ cat test.c 
#include <stdio.h>

int main(int ac, char **av)
{
    printf("%s\n", av[0]);
}
~$ cc -o test test.c
~$./test 
./test
~$ ln -s test coincoin 
~$./coincoin 
./coincoin

Это механизм, используемыйbusybox(широко используемый во встраиваемых системах )для реализации нескольких утилит (ping, route и т.д... )с использованием только одного двоичного файла.

1
27.01.2020, 23:29

[пока не настоящий ответ]

При использовании с исполняемым скриптом, который она -взломала, ни

execl("/path/to/script", "new_av0", (void*)0)

в C, ни

exec -a new_av0 /path/to/script

в оболочках, поддерживающих exec -a, сможет установить $0илиsys.argv[0](или любой другой синтаксис языка, используемый для ссылки на нулевой аргумент )в этом скрипте.

При выполнении интерпретатора скрипта -bang, ядро ​​безвозвратно отбрасывает исходный нулевой аргумент, вставляя на его место имя интерпретатора, любой необязательный аргумент строки -bang и путь к сценарий.

Любое решение обязательно будет сложным, ограниченным или зависящим от языка/системы.

Например, сценарий оболочки можно обмануть с помощью:

sh -c '. /path/to/script' new_av0

Но очевидно, что это не повлияет на командную строку в том виде, в каком она появляется в выводе ps, /proc/<pid>/cmdline, /proc/<pid>/commи т. д.

0
27.01.2020, 23:29

Теги

Похожие вопросы