Перемещение или переименование исполняемого файла (в частности, исполняемого файла Windows под Wine) влияет на его запуск во время его запуска?

В Ubuntu,

при запуске исполняемого файла или файла сценария, если я перемещаю или переименовываю файл, будет ли воздействие работать? при запуске исполняемого файла Windows (например, PDFXCview.exe) под вином, перемещение или переименование исполняемого файла Windows влияет на его работу под вином?

Спасибо.

3
задан 24 March 2018 в 04:07

2 ответа

Самолеты всегда заправляются топливом на земле?

Ну, конечно, вы думаете. Но 0,001% времени они заправляются в воздухе. Например, военные заявки. Так что правило не стойкое. То же самое происходит с исполняемыми файлами и скриптами. Вирусы, например, заражают исполняемые файлы во время их работы, а также копируют на диск. Это хорошо, если они ломаются. Однако, не-вирусы также могут обновлять исполняемые файлы / скрипты.

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

Этот скрипт: Как заставить сценарий регистрировать отдельный файл числом раз он был выполнен? обновляется с количеством раз, когда он был запущен.

Обычно для каждого файла сценария используется отдельный файл конфигурации для записи, сколько раз он запускается. Но если у вас десятки десятков сценариев, имеет смысл хранить счетчик запуска в самом скрипте. Кроме того, вам не нужно отслеживать, где хранится файл конфигурации, и изменять сценарий, если файл конфигурации перемещен. Код для изменения счетчика прогона может быть включен в команду source или . bash для снижения затрат на обслуживание и улучшения удобочитаемости.

Фрагмент кода

Вот соответствующий код из приведенной выше ссылки:

# This script run count: 0 [ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || : # This is useful boilerplate code for shell scripts. Put it at the top of # the shell script you want to lock and it'll automatically lock itself on # the first run. If the env var $FLOCKER is not set to the shell script # that is being run, then execute flock and grab an exclusive non-blocking # lock (using the script itself as the lock file) before re-execing itself # with the right arguments. It also sets the FLOCKER env var to the right # value so it doesn't run again. # Read this script with entries separated newline " " into array mapfile -t ScriptArr < "$0" # Build search string that cannot be named SearchStr="This script" SearchStr=$SearchStr" run count: " # Find our search string in array and increment count for i in ${!ScriptArr[@]}; do if [[ ${ScriptArr[i]} = *"$SearchStr"* ]]; then OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 ) NewCnt=$(( $OldCnt + 1 )) ScriptArr[i]=$SearchStr$NewCnt break fi done # Rewrite our script to disk with new run count # BONUS: Date of script after writing will be last run time printf "%s\n" "${ScriptArr[@]}" > "$0"

Нарушение кода

Я быстро объясните, как работают уникальные части кода.

mapfile -t ScriptArr < "$0"

^ Это читает весь скрипт /script/path/script-name.sh в массив с именем ScriptArr.

OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 ) NewCnt=$(( $OldCnt + 1 )) ScriptArr[i]=$SearchStr$NewCnt

^ Это берет старый подсчитайте строку комментария: # This script run count: 0 и увеличите ее на 1.

printf "%s\n" "${ScriptArr[@]}" > "$0"

^ Это записывает измененный массив сценариев на диск в качестве нового исполняемого скрипта. Хороший (или плохой) побочный эффект - это дата последнего запуска сценария, теперь это дата изменения сценариев.

Многопользовательские соображения

Обратите внимание на переменную FLOCKER из команды выше:

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :

^ Это для нескольких пользователей. Если один пользователь запускает скрипт, он останавливает второго пользователя от запуска того же скрипта. Допустим, вы дождитесь окончания работы первого пользователя, а затем переместите скрипт. Это плохо, потому что второй пользователь, находящийся в режиме ожидания, теперь получает доступ для запуска скрипта, потому что блокировка семафора отбрасывается. Однако после завершения работы первого пользователя вы переместили скрипт в другой каталог.

Сводка

Выполненный сценарий или исполняемый файл может изменить себя или даже может быть изменен другая программа, которая не работает в одном приложении.

Вообще говоря, 99% безопасно перемещать (то есть переименовывать) программу, которая уже запущена. Тем не менее, я никогда этого не сделаю.

Ваш вопрос о wine (псевдо-Windows), но эти сценарии bash были разработаны для Ubuntu под Linux и Ubuntu под Windows (WSL). Дело не столько в wine, сколько в том, что можно сделать в мире программирования / сценариев.

1
ответ дан 17 July 2018 в 18:13

Самолеты всегда заправляются топливом на земле?

Ну, конечно, вы думаете. Но 0,001% времени они заправляются в воздухе. Например, военные заявки. Так что правило не стойкое. То же самое происходит с исполняемыми файлами и скриптами. Вирусы, например, заражают исполняемые файлы во время их работы, а также копируют на диск. Это хорошо, если они ломаются. Однако, не-вирусы также могут обновлять исполняемые файлы / скрипты.

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

Этот скрипт: Как заставить сценарий регистрировать отдельный файл числом раз он был выполнен? обновляется с количеством раз, когда он был запущен.

Обычно для каждого файла сценария используется отдельный файл конфигурации для записи, сколько раз он запускается. Но если у вас десятки десятков сценариев, имеет смысл хранить счетчик запуска в самом скрипте. Кроме того, вам не нужно отслеживать, где хранится файл конфигурации, и изменять сценарий, если файл конфигурации перемещен. Код для изменения счетчика прогона может быть включен в команду source или . bash для снижения затрат на обслуживание и улучшения удобочитаемости.

Фрагмент кода

Вот соответствующий код из приведенной выше ссылки:

# This script run count: 0 [ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || : # This is useful boilerplate code for shell scripts. Put it at the top of # the shell script you want to lock and it'll automatically lock itself on # the first run. If the env var $FLOCKER is not set to the shell script # that is being run, then execute flock and grab an exclusive non-blocking # lock (using the script itself as the lock file) before re-execing itself # with the right arguments. It also sets the FLOCKER env var to the right # value so it doesn't run again. # Read this script with entries separated newline " " into array mapfile -t ScriptArr < "$0" # Build search string that cannot be named SearchStr="This script" SearchStr=$SearchStr" run count: " # Find our search string in array and increment count for i in ${!ScriptArr[@]}; do if [[ ${ScriptArr[i]} = *"$SearchStr"* ]]; then OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 ) NewCnt=$(( $OldCnt + 1 )) ScriptArr[i]=$SearchStr$NewCnt break fi done # Rewrite our script to disk with new run count # BONUS: Date of script after writing will be last run time printf "%s\n" "${ScriptArr[@]}" > "$0"

Нарушение кода

Я быстро объясните, как работают уникальные части кода.

mapfile -t ScriptArr < "$0"

^ Это читает весь скрипт /script/path/script-name.sh в массив с именем ScriptArr.

OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 ) NewCnt=$(( $OldCnt + 1 )) ScriptArr[i]=$SearchStr$NewCnt

^ Это берет старый подсчитайте строку комментария: # This script run count: 0 и увеличите ее на 1.

printf "%s\n" "${ScriptArr[@]}" > "$0"

^ Это записывает измененный массив сценариев на диск в качестве нового исполняемого скрипта. Хороший (или плохой) побочный эффект - это дата последнего запуска сценария, теперь это дата изменения сценариев.

Многопользовательские соображения

Обратите внимание на переменную FLOCKER из команды выше:

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :

^ Это для нескольких пользователей. Если один пользователь запускает скрипт, он останавливает второго пользователя от запуска того же скрипта. Допустим, вы дождитесь окончания работы первого пользователя, а затем переместите скрипт. Это плохо, потому что второй пользователь, находящийся в режиме ожидания, теперь получает доступ для запуска скрипта, потому что блокировка семафора отбрасывается. Однако после завершения работы первого пользователя вы переместили скрипт в другой каталог.

Сводка

Выполненный сценарий или исполняемый файл может изменить себя или даже может быть изменен другая программа, которая не работает в одном приложении.

Вообще говоря, 99% безопасно перемещать (то есть переименовывать) программу, которая уже запущена. Тем не менее, я никогда этого не сделаю.

Ваш вопрос о wine (псевдо-Windows), но эти сценарии bash были разработаны для Ubuntu под Linux и Ubuntu под Windows (WSL). Дело не столько в wine, сколько в том, что можно сделать в мире программирования / сценариев.

1
ответ дан 23 July 2018 в 19:02
  • 1
    Технически, я думаю, вы имеете в виду «псевдо». :) – Andrea Lazzarotto 24 March 2018 в 15:53
  • 2
    @AndreaLazzarotto Профессиональная опасность от орфографии sudo все время;) – WinEunuuchs2Unix 25 March 2018 в 02:11

Другие вопросы по тегам:

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