Тот же вопрос задают и отвечают здесь:
https://stackoverflow.com/questions/8148715/how-to-set-limit-on-directory-size-in-linux
в основном сделайте виртуальную файловую систему путем заполнения файла нулями к размеру, Вы хотите, затем создаете файловую систему в том файле и затем loopmount он к каталогу, который Вы хотите ограничить.
Статья Linux Quartly об этом здесь: http://www.linuxquestions.org/questions/linux-server-73/directory-quota-601140/
Учебное руководство здесь: http://souptonuts.sourceforge.net/quota_tutorial.html
Большинство «клиентов протокола передачи файлов SSH (SFTP)» изначально созданы для интерактивного использования.
Это не означает, что в них отсутствуют параметры пакетного режима и т.п., но если вы ищете передачу файлов на основе сценариев по протоколу SSH, обратите внимание на scp
или lftp
вместо этого.
lftp
(домашняя страница) - это то, что я использую во всех моих автоматических передачах файлов, и у него отличная обработка ошибок с надежным статусом выхода. Он был разработан с расчетом на надежность.
Для lftp
существует множество параметров, и вы можете указать любые ssh
параметры, которые вам нравятся, например -oStrictHostKeyChecking = yes
, если вы укажете конкретный программа подключения для использования.
Пример:
MYSSHOPTIONS="-oStrichtHostKeyChecking=yes"
CONNPROG="ssh -a -x ${MYSSHOPTIONS}"
cat > ${cmdfile} <<- EOF
set sftp:max-packets-in-flight 16
set sftp:connect-program ${CONNPROG}
open -u ${remoteuser},${password-unless-pubkey-setup} sftp://${remotehost}
put localfile -o remotepathname
EOF
lftp -f ${cmdfile} > ${sendlog} 2>&1
RC=$?
if test $RC -ne 0
then
failed
else
reliably OK
fi
Пример довольно длинный. Он создает командный файл, который устанавливает некоторые параметры, и загружает один файл localfile
с возможным другим удаленным путем
на другой стороне.
lftp
: Если вы хотите проверить доступ к sftp для входа в систему, вы можете использовать этот шаблон в качестве отправной точки для дальнейших экспериментов:
#!/bin/sh - mykey=/home/localuser/.ssh/id_rsa remusr=bupuser remhost=server.destination.domain.com tmpfile=/tmp/sftptest.$$ cleanup() { rm -f ${tmpfile} } trap cleanup 0 sftp -i $mykey -oPubkeyAuthentication=yes -oPasswordAuthentication=no -oKbdInteractiveAuthentication=no -oStrichtHostKeyChecking=yes ${remusr}@${remhost} ${tmpfile} 2>&1 dir exit EOF ST=$? if test $ST -ne 0 then echo SFTP LOGIN FAILURE. RC=${ST} 1>&2 exit $ST fi cat ${tmpfile} # or do some clever grepping on it exit $ST
Я написал скрипты ожиданий и бэша, чтобы это сработало. ... (хотя это может стать более причудливым, как упоминалось выше).
Бэш-скрипт:
выполняется с тремя аргументами: user, pass и host. Например ./bwrap.sh ninja_user ninja_star1234 ninja.com
Скрипт создает лог-файл, который позже используется для проверки успешного входа/выхода.
#!/bin/bash
# log file
log="connection_test.log"
if [ -f $log ];
then
echo "Older file $log exists, removing and creating new..."
rm -rf $log
touch $log
else
echo "Creating log file"
touch $log
fi
# running expect script.
# arg 1 is user, arg 2 is pass, arg 3 is host
./one.exp $1 $2 $3 >> $log
# checking log for connections
if grep --quiet logout $log; then
echo "connection successful, proceeding to backup" >> $log
else
echo "connection failed, please check server" >> $log
exit 1
fi
Теперь, к ожидаемому скрипту, он имеет таймаут 10 секунд, и я на самом деле предпочитаю работать со строгим ключом хоста. Если вы хотите работать со строгим ключом хоста, отредактируйте соответствующую строку и добавьте ожидаемый "yes/no" .....
#!/usr/bin/expect -f
set user [lindex $argv 0];
set password [lindex $argv 1];
set host [lindex $argv 2];
set timeout 10
# now ssh
spawn ssh $user@$host -o StrictHostKeyChecking=no
match_max 100000 # Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
expect "*$ "
send -- "whoami\r"
expect "<user name>" # change user
send -- "exit\r"
expect eof
Надеюсь, это поможет.
Для соединения с sftp
, пожалуйста:
добавьте строку в скрипт bash
, где $4
- это порт
./one.exp $1 $2 $3 $4 >> $log
, добавьте строку в скрипт expect
:
set port [lindex $argv 3];
заменить в ожидаемом сценарии
spawn ssh $user@$host -o StrictHostKeyChecking=no
на
spawn sftp $host@$user -o Port=$port StrictHostKeyChecking=no
и
expect "*$ "
на
expect "sftp>"
Так как у меня нет SFTP-сервера для его тестирования, изменения вносятся на основе [этого вопроса]: sftp файла с помощью shell скрипта
Также, [ожидать домашнюю страницу]: http://expect.sourceforge.net/ может быть удобно.
Наконец, читая ваш комментарий относительно прямого подхода, можно просто использовать nc
и посмотреть, работает ли host:port. Для этого вы можете использовать:
#!/bin/bash
# log file
log="connection_test.log"
if [ -f $log ];
then
echo "Older file $log exists, removing and creating new..."
rm -rf $log
touch $log
else
echo "Creating log file"
touch $log
fi
# nc
nc_command=`nc -z -w 5 $1 $2 | tee -a $log`
if [[ $nc_command == *succeeded* ]];
then
echo "Server is listening, ready for backup" | tee -a $log
else
echo " Server seems to be offline, please check" | tee -a $log
exit 1
fi
для запуска последнего скрипта: ./test.sh host:port
Можно проверить соединение sftp
, просто выполнив тест соединения ssh
:
if $(ssh -q belmin@mysever.bfworks.com exit)
then
echo yes
fi
Если сервер не разрешает ssh
, можно использовать nmap
, но при этом не проверяется аутентификация ключа:
nmap myserver.bfworks.com -PN -p ssh | grep 'open'