LINUX.ORG.RU

mc & adb

 ,


0

1

Господа а я правильно понимаю что фактически примерно так же как и ftp:// к сабжу можно приделать и доступ к любым android девайсам посредством adb?

И если да то куда копать?

★★★★★

будет время подумай над zip

anonymous
()

аналог sftp

adb по сути даёт доступ к shell, как и ssh. Поэтому можно сделать аналогично, только заменить ssh на adb. Думаю, это самое простое. Доступ по ssh реализован в файле fish.c Там вместо ssh может использоваться rsh. Надо попробовать добавить ещё и adb_sh — обёртку для adb shell. Можно пробовать написать скрипт для extfs — но не знаю, какая extfs позволяет не только чтение, но запись (чтоб использовать для примера). Тут советовали поизучать zip. Но я что-то только unzip обнаружил.

PS: самому такая фича хотелась. Это удобнее, чем устанавливать MC в девайс

seyko2
()

Поставь busybox, запусти tftpd/sshd. Через adb организуй канал или ещё как (он же как сетевушка должен быть виден). Как-то так. Правда root нужен.

ziemin ★★
()
Ответ на: комментарий от ziemin

Как-то так. Правда root нужен.

Для adb root на телефоне не нужен. Достаточно в настройках разрешить „отладку через usb“ и после этого по крайней мере читать оно уж точно разрешит.

Остальное твоё я вообще неасилил потому что для adb всё нужное и так в любой прошивке… Зависит только от степени зажопленности прошивка. В крайне упоротых случаях да нужен root.

init_6 ★★★★★
() автор топика
Ответ на: аналог sftp от seyko2

PS: самому такая фича хотелась. Это удобнее, чем устанавливать MC в девайс

Так вот именно оно было бы просто крутотень! Поскольку достаточно было бы просто разрешить в самом телефоне а дальше вся его ФС в любом mc ;)

init_6 ★★★★★
() автор топика
Ответ на: комментарий от init_6

Засада

Есть в MC так называемая extfs. Как раз как советовали для zip и подобных (для архивов). Я попробовал реализовать через неё adb. Для начала хождение. Для этого только надо вывести список как выводит команда «ls -l». MC корневой каталог показывает. А в подкаталогах — пусто. Лезу читать подробности: оказывается надо выводить содержимое всего архива, а не одного каталога. Засада. Похоже, надо сначала MC научить запрашивать содержимое только одного каталога. Пока непонятно как это сделать. А с fish геморой ещё больше (у меня с налёту вообще не получилось). Вот для попробовать. Файл под именем adb+ (с атрибутом на выполнение) надо поместить в /usr/libexec/mc/extfs.d, поместить куда-нибудь adb (например в /usr/bin) и подключить телефон. Потом в командной строке вводим «cd adb://» и должны получить в панели MC содержимое корневого каталога

#!/bin/bash
#
# extfs support for adb shell
# Written by Sergey Ya. Korshumoff <seyko2@gmail.com>

set -e
rc=0

adb_list ()
{
    DIR=$@
    LIST="$(adb shell ls -l $DIR)"
    IFS='
'
    for LINE in $LIST; do
	LINE=$(echo $LINE | tr -d '\r')
	IFS=' '; FILD=( $LINE )
	PERM=${FILD[0]}
	OWNER=${FILD[1]}
	GROUP=${FILD[2]}
	SIZE=${FILD[3]}
	if [ -n "$(echo $SIZE | grep -)" ]; then
	    SIZE='0'
	    DATE=${FILD[3]}
	    TIME=${FILD[4]}
	    FILE=${FILD[5]}
	    ARROW=${FILD[6]}
	    LINK=${FILD[7]}
	else
	    DATE=${FILD[4]}
	    TIME=${FILD[5]}
	    FILE=${FILD[6]}
	    ARROW=${FILD[7]}
	    LINK=${FILD[8]}
    fi
    DATE_TIME=$(date -d "$DATE $TIME" "+%m-%d-%Y %H:%M")
    echo "$PERM 1 $OWNER $GROUP $SIZE $DATE_TIME $FILE $ARROW $LINK"
done
}

adb_copyout ()
{
    rc=1
}

adb_copyin ()
{
    rc=1
}

adb_mkdir ()
{
    rc=1
}

mcu7zip_rm ()
{
    rc=1
}

mcu7zip_rmdir ()
{
    rc=1
}

LC_ALL=C
export LC_ALL

ADB=$(which adb)
if [ -z "$ADB" ]; then
    echo "Error: could not find adb" >&2
    rc=1
else
    cmd="$1"
    shift
    case "$cmd" in
	list)    adb_list    "$@" ;;
	copyout) adb_copyout "$@" ;;
	copyin)  adb_copyin  "$@" ;;
	mkdir)   adb_mkdir   "$@" ;;
	rm)      adb_rm      "$@" ;;
	rmdir)   adb_rmdir   "$@" ;;
	*) rc=1 ;;
    esac
fi
exit $rc
seyko2
()
Ответ на: Засада от seyko2

Похоже, надо сначала MC научить запрашивать содержимое только одного каталога. Пока непонятно как это сделать.

в чем сложность то?

angel_il ★★★★
()
Ответ на: комментарий от angel_il

Попробуй на компе ls -lR /

Сколько для начала это времени займёт? А тут ещё надо вывод парсить и преобразовывать. А вдобавок, переименовать — команды такой нет. Сменить атрибуты — тоже. Но для начала сойдёт, конечно, и такой вариант

seyko2
()
Ответ на: Засада от seyko2

Добавка

Для автоматического запуска adb добавить в adb_list перед LINE=

$ADB root &> /dev/null

Можно конечно только «$ADB start-server». Но без root мало-что можно сделать

Для просмотра файлов:

adb_copyout ()
{
    FROM="$2"
    TO="$3"
    $ADB root &> /dev/null
    $ADB pull $FROM $TO &> /dev/null
    rc=$?
}

seyko2
()
Ответ на: Попробуй на компе ls -lR / от seyko2

А ещё

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

seyko2
()
Ответ на: комментарий от angel_il

Набросок

Вырисовывается такая картина: внешинй скрипт на команду list первой строчкой выводит что-то типа

### PATH
где PATH — каталог, содержимое которого он выводит. По этой строчке MC понимает, что не получил содержимое всего архива и устанавливает флаг для каталогов, что их содержимое ещё не прочитано. Когда ему нужно вывести содержимое этих каталогов, он снова вызывает внешний скрипт с командой list и именем каталога, содержимое которого его интересует. Править не так то и много.

seyko2
()
Ответ на: Набросок от seyko2

Путь оказался правильным

Реализовал в extfs режим частичного считывания (вывод плугином содержимого только одного каталога, без рекурсии). После чего плугин adb+ заработал как часы. Патч получился не совсем маленьким, так как попутно пришлось дорабатывать некоторые, можно сказать, косяки. В частности, если плугин выводит одну и ту же строчку дважды, то вы увидите в панели дуплет. MC позволял (создавал) каталоги-файлы с именем нулевой длины. Если строка для файла-каталога имеет пробелы после имени файла, то MC создавал файл с именем, содержащим пробелы.

seyko2
()
Ответ на: комментарий от ddos3

Попробовал

Тоже нормально работает, правда попробовал уже после того, как для MC написал. Хороший повод поизучать, как приспосабливать FUSE для своих нужд.

PS: Спасибо за ссылку.

seyko2
()
Ответ на: комментарий от init_6

Возможно...

что не совсем правильно в смысле производительности реализовано разрешение символических ссылок. Ибо сильно тормозит при входе в каталог с достаточным их количеством. Надо будет попробовать как-то оптимизировать..

seyko2
()
Ответ на: комментарий от init_6

Стало получше

Отложил вызов adb для символических ссылок. Стало получше. Архив с подправленным extfs-partial-list.patch

https://drive.google.com/file/d/0B35PjbLHNzyqUlVyaVpuU3JmZjQ/edit?usp=sharing

PS: пришла мысль, что надо бы попробовать для MC модуль работы с Google drive написать. Через Web не так удобно...

seyko2
()
Ответ на: комментарий от angel_il

модуль для работы google drive

Посмотрел grive, drive и ocaml fuse для google drive. Из всего этого собрался и как-то работает только drive (написанный на go). Но у него ориентация на синхронизацию, необходимых для работы MC-плугина команд нет. То есть (как будет время) надо сначала его доработать. Может попробовать попросить автора добавить функциональность?

seyko2
()
Ответ на: комментарий от angel_il

webdav

Тут ещё важно на чём написано. grive написан на c++ и требует кучу библиотек для сборки. Это уже плохо. К тому же чего-то там не хватило, ибо у меня не собрался (ругался на log и другие отладочные функции). google-drive-ocamlfuse — тоже не собрался. Там куча разных пакетных манагеров и систем сборки с разными умолчаниями, которые друг-друга не понимают и не умеют находить пакеты, установленные другими. Бинарник drive большой, но он статически слинкован и ничего другого ему не надо. Собирается быстро и просто. Автор — американка @rakill Burcu Dogan. Проект — gigithub.com/rakyll/drivethub.com/rakyll/drive Как с ней связаться через hithub — непонятно. Через twitter — тоже без регистрации наверно нельзя. В принципе всё необходимое в drive есть: может отдельный файл выложить в google (судя по описанию). Скачивает отдельный файл или директорию. Не достаёт функции list. Но в неявном виде она там есть: если вызвать синхронизацию пустого локального каталога с google, то показывется список файлов в google с минусиками (будут удалены) и запросом на подтверждение. Так что по идее смотрим исходники google-drive-ocamlfuse и делаем аналогично на go.

PS: а для yandex-диск API как для google drive ?

seyko2
()
Ответ на: комментарий от init_6

проблема с adb

Только одна — в самом adb. Даже когда всё настроил и работаешь с adb, потом куда-то отошёл, то устройство засыпает, связь может прекратиться. В общем надо осоединить устройство от компа, потом подключить, возможно что-то на устройстве нажать... Уверен, что в qtadb тоже будет что-то насчёт решения проблем связи (в adbfs такой абзац есть)

seyko2
()
Ответ на: проблема с adb от seyko2

проблема с adb Только одна — в самом adb.

+100500

Я всю прелесть adb познал когда мигрировал со стока на CM 11 на своём htc desire saga. Геморроя конечно достаточно но в результате оно того стоило! И вот после этого меня и начало посещать насчет mc & adb.

seyko2 я пока что как раз добираюсь до тестирования твоих патчей. Как проверю выложу в оверлей.

Насчет облачных сервисов можно потыкать сырцы OpenExplorer по крайней мере в нем заявлена поддержка:

http://brandroid.org/open/

- Cloud connected (Dropbox, Box, Drive)

Но в целом тот же google-drive, учитывая с какой скоростью работает вэб интерфейс, было бы просто шикарно!

Отдельное спасибо многие сказали бы за seafile это открытый аналог дропбокса построенный на всё том же git-е. Сырцы к примеру вон тоже можно потыкать.

init_6 ★★★★★
() автор топика
Последнее исправление: init_6 (всего исправлений: 1)
Ответ на: комментарий от anonymous

не туда ходи

И где там исходники? git говорит, что repo пустой. По назаванию архивов как-то не видно, что в них сырцы есть.

PS: про google drive. Предположим, что с помощью модифицированного drive написали extfs для чтения-записи. И в каком виде этот drive к MC прикручивать? Клонировать проект на github?

PPS: extfs по сравнению с fish имеет недостаток: не перечитывает каталог по Ctrl-R Правда не уверен — просто по ощущению.

seyko2
()
Ответ на: не туда ходи от seyko2

плюс GPL и почта авторов, что дает право и возможность попросить последнюю версию исходников

anonymous
()
Ответ на: комментарий от angel_il

через webdav

лучше всего через webdav работает cadaver. Но в нём не реализована загрузка/выгрузка файлов больше 25Mb. Вроде по идее это возможно, ведь wget докачивает файлы.

drive на go вроде не ругается при запросе выгрузить в google drive большой файл. Однако он не показывает процент выгруженного: то 0%, то сразу 100%. И регистрация у него неудобна: надо получить на WEB строку OAuth и скормить ему.

davfs2 неудобен тем, что не показывает — что он делает сейчас. Файлы сначала копирует в локальный кэш. Большие файлы толже не выгружает — ругается молчком в syslog.

На github есть avfs — клон vfs от MC. В нём есть скачивание по webdav. Загрузка отсутствует.

Вывод: для реализации доступа к google drive в MC требуется много времени.

seyko2
()
Ответ на: через webdav от seyko2

avfs — клон vfs от MC

Сдаётся мне, наоборот. Это mc vfs — клон аvfs.

akk ★★★★★
()
Ответ на: комментарий от init_6

поподробнее, если можно

После некоторого изучения документации всё же не понял, где/как он применяется. Вроде сетевое хранилище файлов типа samba/nfs, только другой ориентации (упор на синхронизацию). Устранение избыточности, что-то там ещё. Доступ через browser/http в основном (судя по картинкам), но с продолжением передачи файлов по другому протоколу-каналу (вроде как в ftp). Начиная с версии 2.4 (?) имеется возможность (для админа на сервере) смонтировать хранилище через fuse-adapter.

PS: про dropbox только слышал звон в новостях и в сравнениях Google-Drive, Yandex Disk, ...

seyko2
()
Ответ на: поподробнее, если можно от seyko2

поподробнее, если можно

Про seafile?

seafile пилят как открытый и свободный аналог dropbox. Т.е. снаружи seafile и dropbox выглядят почти одинаково. Разница только в том что у seafile открыто полностью все. Где-то есть сервер seafile. Можно либо использовать любой «облачный» сервер seafile в интернете либо поставить на своем оборудовании свой собственный. Есть клиенты seafile причем они есть и под android и под gnu/linux. Ну а дальше всё собственно так же как и в google-drive или yandex disk. Т.е. точно так же всё синхронизируется между всеми клиентами, доступ к файлам можно открывать… Главная разница со всем остальным состоит в том, что и клиент и сервер seafile открыты.

init_6 ★★★★★
() автор топика
Ответ на: комментарий от init_6

Спасибо

То есть если внедрять технологию web-applications (отображение интерфейса релизовывать в броузере, а функционал в броузере или на www-сервере), то seafile — самое оно. Ибо на применени в этой области и рассчитан (авторизация и обмен запросами по http-протоколу). Фактически это жёсткий диск (хранилиже файлов, баз данных и тд) для www-приложений. Наверно как-то так...

PS: тут недавно выяснилось, что с технической точки зрения файловая система в пользовательском пространстве (fuse) даже имеет преимущество перед реализацией в пространстве ядра. Если смонтировать корневую файловую систему для контейнера openvz с помощью aufs, то suspend/resume не проходят. А если использовать unionfs-fuse, то всё нормально. Как оказалось, открытые в контейнере файлы (при использовании aufs) ядро видит с полным именем оригинального файла (имя файла в branch). И поскольку это имя вне корня контейнера, то отказывается выполнять suspend/resume. Конечно, unionfs-fuse помедленнее, но не так уж сильно. А из контейнера aufs при такой ситуации теоретически можно выскочить при помощи эксплоита, аналогичного недавнему эксплоиту для docker.

PPS: После этого открытия до меня дошло, почему systemd-контейнер пытается сочинять содержимое /etc динамически — подмонтировать-то с помощью «mount -o bind» ничего нельзя :-)

seyko2
()
Ответ на: Спасибо от seyko2

seafile — самое оно

Если у тебя есть несколько устройств связанных при помощи инторнета и тебе нужна синхронизация определенных файлов на всех устройствах одновременно да еще и при помощи открытых и свободных компонентов то seafile самое то что доктор прописал.

init_6 ★★★★★
() автор топика
Ответ на: комментарий от ddos3

Спасибо за ссылку! Прекрасно все работает! Пол дня сегодня занимался поиском чего-то подобного, пока не зашел на ЛОР. Даже уже хотел сам ворос задать, но наткнулся на эту тему. До этого нашел QtADB, но оно вообще не удобное, по сравнению с adbfs

deys ★★★
()
Ответ на: Спасибо от seyko2

seyko2 Спасибо большое! Сегодня наконец-то проверил. Работает отлично!!!

Кому нужен сабж layman -a init6; USE="adb" emerge app-misc/mc

init_6 ★★★★★
() автор топика
16 октября 2014 г.
Ответ на: Засада от seyko2
#!/bin/bash
#
# extfs support for adb shell: android device explorimg
# Written by Sergey Ya. Korshumoff <seyko2@gmail.com>, 2014
#   Introduced MC support for a partial list command:
#   only one directory a time. The mode is designated
#   by "### " in the first line of output. In such mode
#   after an archive name parameter a directory parameter
#   is followed. Usage: cd adb://

adb_list() {
    DIR=$@
    echo "### $DIR ### $(date)"
    DIR=`echo $DIR | sed -e 's,^/,,'`
    echo "$(date +%s.%N) $DIR" >> /tmp/adb_list.log
    $ADB shell toolbox ls -la $DIR | tr -d '\r' | { while read -ra FILD; do
        PERM=${FILD[0]}
        OWNER=${FILD[1]}
        GROUP=${FILD[2]}
        ARROW=""
        LINK=""
        SIZE='0'
        TYPE=`echo $PERM | dd bs=1 count=1 2>/dev/null`
        case "$TYPE" in
            d|s) DATE=${FILD[3]}; TIME=${FILD[4]}; FILE=${FILD[5]} ;;
            l)   DATE=${FILD[3]}; TIME=${FILD[4]}; FILE=${FILD[5]}; ARROW=${FILD[6]}; LINK=${FILD[7]} ;;
            c|b) DATE=${FILD[5]}; TIME=${FILD[6]}; FILE=${FILD[7]}; SIZE="${FILD[3]}${FILD[4]}" ;;
            *)   DATE=${FILD[4]}; TIME=${FILD[5]}; FILE=${FILD[6]}; SIZE=${FILD[3]}  ;;
        esac
        DATE_TIME=`date -d "$DATE $TIME" "+%m-%d-%Y %H:%M"`
        echo "$PERM 1 $OWNER $GROUP $SIZE $DATE_TIME $DIR/$FILE $ARROW $LINK"
    done }
}

adb_copyout() {
    FROM="$2"
    TO="$3"
    echo "$(date +%s.%N) $FROM $TO" >> /tmp/adb_copyout.log
    $ADB pull $FROM $TO &> /dev/null
    rc=$?
}

adb_copyin() {
    TO="$2"
    FROM="$3"
    echo "$(date +%s.%N) $FROM $TO" >> /tmp/adb_copyin.log
    LINE=`$ADB shell toolbox ls -l $TO | tr -d '\r'`
    [ "$LINE" != "" ] && {
        PERM=`$ADB shell stat -c %a $TO | tr -d '\r'`
        OWNER=`$ADB shell stat -c %u $TO | tr -d '\r'`
        GROUP=`$ADB shell stat -c %g $TO | tr -d '\r'`
    }
    $ADB push $FROM $TO &> /dev/null
    rc=$?
    [ "$LINE" != "" ] && {
        $ADB shell chmod $PERM $TO &> /dev/null
        $ADB shell chown $OWNER:$GROUP $TO &> /dev/null
    }
}

adb_rm() {
    FILE="$2"
    echo "$(date +%s.%N) $FILE" >> /tmp/adb_rm.log
    $ADB shell rm $FILE &> /dev/null
    rc=$?
}

adb_mkdir() {
    DIR="$2"
    echo "$(date +%s.%N) $DIR" >> /tmp/adb_rm.log
    $ADB shell mkdir $DIR &> /dev/null
    rc=$?
}

adb_rmdir() {
    DIR="$2"
    echo "$(date +%s.%N) $DIR" >> /tmp/adb_rm.log
    $ADB shell rmdir $DIR &> /dev/null
    rc=$?
}

LC_ALL=C
export LC_ALL

ADB=$(which adb)
if [ -z "$ADB" ]; then
    echo "Error: could not find adb"
    exit 1
fi

ADB_STATE=$($ADB get-state | tail -n1)
[ "$ADB_STATE" != "device" ] && {
    $ADB kill-server > /dev/null 2>&1
    $ADB usb > /dev/null 2>&1
}

ADB_STATE=$($ADB get-state | tail -n1)
[ "$ADB_STATE" != "device" ] && {
    echo "Error: adb is not connected to device"
    exit 1
}

cmd="$1"
shift

rc=0
case "$cmd" in
    list)    adb_list    "$@" ;;
    copyout) adb_copyout "$@" ;;
    copyin)  adb_copyin  "$@" ;;
    mkdir)   adb_mkdir   "$@" ;;
    rm)      adb_rm      "$@" ;;
    rmdir)   adb_rmdir   "$@" ;;
    *) rc=1 ;;
esac
exit $rc
RekGRpth
()
Ответ на: комментарий от RekGRpth

Что весь этот ^ высер делает здесь? И зачем он нужен если выше прямым текстом сказано:

Кому нужен сабж layman -a init6; USE=«adb» emerge app-misc/mc

Для особо альтернативно одарённых объясняю на пальцах тут ТЫЦ сами патчи применять вот в таком порядке.

init_6 ★★★★★
() автор топика
Ответ на: комментарий от init_6

это я маленько скрипт поправил, чтобы корректнее работало, вот ещё версия

#!/bin/bash
#
# extfs support for adb shell: android device explorimg
# Written by Sergey Ya. Korshumoff <seyko2@gmail.com>, 2014
#   Introduced MC support for a partial list command:
#   only one directory a time. The mode is designated
#   by "### " in the first line of output. In such mode
#   after an archive name parameter a directory parameter
#   is followed. Usage: cd adb://

adb_list() {
    DIR=$@
    echo "### $DIR ### $(date)"
    DIR=`echo $DIR | sed -e 's,^/,,'`
    #echo "$(date +%s.%N) $DIR" >> /tmp/adb_list.log
    $ADB shell toolbox ls -lan $DIR | tr -d '\r' | { while read -ra FILD; do
        if echo "${FILD[@]}" | grep -o "No such file or directory" &>/dev/null; then
            echo "lrwxrwxrwx 1 0 0 0 01-01-1970 00:00:00 ${FILD[0]}"
        else
            PERM=${FILD[0]}
            OWNER=${FILD[1]}
            GROUP=${FILD[2]}
            SIZE=0
            TYPE=`echo $PERM | dd bs=1 count=1 2>/dev/null`
            case "$TYPE" in
                d|s) DATE=${FILD[3]}; TIME="${FILD[4]}"; FILE=${FILD[5]} ;;
                l)   DATE=${FILD[3]}; TIME="${FILD[4]}"; FILE="${FILD[5]} ${FILD[6]} ${FILD[7]}" ;;
                c|b) DATE=${FILD[5]}; TIME="${FILD[6]}"; FILE=${FILD[7]}; SIZE="${FILD[3]}${FILD[4]}" ;;
                *)   DATE=${FILD[4]}; TIME="${FILD[5]}"; FILE=${FILD[6]}; SIZE=${FILD[3]} ;;
            esac
            DATE_TIME=`date -d "$DATE $TIME" "+%m-%d-%Y %H:%M"`
            echo "$PERM 1 $OWNER $GROUP $SIZE $DATE_TIME $DIR/$FILE"
        fi
    done }
}

adb_copyout() {
    FROM="$2"
    TO="$3"
    #echo "$(date +%s.%N) $FROM $TO" >> /tmp/adb_copyout.log
    $ADB pull $FROM $TO &> /dev/null
    rc=$?
}

adb_copyin() {
    TO="$2"
    FROM="$3"
    #echo "$(date +%s.%N) $FROM $TO" >> /tmp/adb_copyin.log
    LINE=`$ADB shell toolbox ls -l $TO | tr -d '\r'`
    [ "$LINE" != "" ] && {
        PERM=`$ADB shell stat -c %a $TO | tr -d '\r'`
        OWNER=`$ADB shell stat -c %u $TO | tr -d '\r'`
        GROUP=`$ADB shell stat -c %g $TO | tr -d '\r'`
    }
    $ADB push $FROM $TO &> /dev/null
    rc=$?
    [ "$LINE" != "" ] && {
        $ADB shell chmod $PERM $TO &> /dev/null
        $ADB shell chown $OWNER:$GROUP $TO &> /dev/null
    }
}

adb_rm() {
    FILE="$2"
    #echo "$(date +%s.%N) $FILE" >> /tmp/adb_rm.log
    $ADB shell rm $FILE &> /dev/null
    rc=$?
}

adb_mkdir() {
    DIR="$2"
    #echo "$(date +%s.%N) $DIR" >> /tmp/adb_rm.log
    $ADB shell mkdir $DIR &> /dev/null
    rc=$?
}

adb_rmdir() {
    DIR="$2"
    #echo "$(date +%s.%N) $DIR" >> /tmp/adb_rm.log
    $ADB shell rmdir $DIR &> /dev/null
    rc=$?
}

LC_ALL=C
export LC_ALL

ADB=$(which adb)
if [ -z "$ADB" ]; then
    echo "Error: could not find adb"
    exit 1
fi

ADB_STATE=$($ADB get-state | tail -n1)
[ "$ADB_STATE" != "device" ] && {
    $ADB kill-server > /dev/null 2>&1
    $ADB usb > /dev/null 2>&1
}

ADB_STATE=$($ADB get-state | tail -n1)
[ "$ADB_STATE" != "device" ] && {
    echo "Error: adb is not connected to device"
    exit 1
}

cmd="$1"
shift

rc=0
case "$cmd" in
    list)    adb_list    "$@" ;;
    copyout) adb_copyout "$@" ;;
    copyin)  adb_copyin  "$@" ;;
    mkdir)   adb_mkdir   "$@" ;;
    rm)      adb_rm      "$@" ;;
    rmdir)   adb_rmdir   "$@" ;;
    *) rc=1 ;;
esac
exit $rc

RekGRpth
()
30 декабря 2014 г.
Ответ на: комментарий от RekGRpth

Надо будет потестировать

А если на словах, то в чём улучшение? toolbox сразу выводит содержимое каталога в нужном формате?

seyko2
()
8 февраля 2015 г.
Ответ на: комментарий от RekGRpth

$ADB shell rm $FILE &> /dev/null

Самую главную ошибку не исправили: все переменные должны быть обёрнуты в двойные кавычки. Иначе попытка перейти в корень и удалить файл с именем "-rf data" обернётся катастрофой.

AITap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.