Sftpサーバーにログインした後にディレクトリが存在しない場合は、ディレクトリを作成したいと思います。
test.sh
sftp [email protected] << EOF
mkdir test
put test.xml
bye
EOF
今、私はtest.shを呼び出し、毎回異なるファイルをtestフォルダーにアップロードします。これを実行するとき
mkdir test
1回目は機能し、2回目はスローします。ディレクトリを作成できませんでした:失敗エラー?
存在しない場合にディレクトリを作成する方法、および存在する場合はsftpにディレクトリを作成しないでください。
このスレッドが古く、回答済みとマークされていることを理解していますが、私の場合は回答が機能しませんでした。 「ディレクトリのsftpチェック」に関する検索のためのグーグルの2番目のページなので、ここに数時間節約できた更新があります。
EOTを使用すると、ディレクトリが見つからないために発生したエラーコードをキャプチャできません。私が見つけた回避策は、呼び出しの指示を含むファイルを作成し、その自動呼び出しの結果をキャプチャすることでした。
以下の例ではsshpassを使用していますが、私のスクリプトでもsshkeysで認証する同じ方法を使用しています。
手順を含むファイルを作成します。
echo "cd $RemoteDir" > check4directory
cat check4directory; echo "bye" >> check4directory
権限の設定:
chmod +x check4directory
次に、バッチ機能を使用して接続します。
export SSHPAA=$remote_pass
sshpass -e sftp -v -oBatchMode=no -b check4directory $remote_user@$remote_addy
最後に、エラーコードを確認します。
if [ $? -ge "1" ] ; then
echo -e "The remote directory was not found or the connection failed."
fi
この時点で、1を終了するか、他のアクションを開始できます。パスワードなどの別の理由でSFTP接続が失敗した場合、またはアドレスが正しくない場合は、エラーによってアクションが実行されます。
別のバリエーションは、SFTPセッションを2つに分割することです。
最初のSFTPセッションは、単にMKDIRコマンドを発行します。
次に、2番目のSFTPセッションは、ディレクトリの存在を想定してファイルを配置できます。
アカウントのSSHアクセスを使用して、最初にディレクトリが存在するかどうかを確認できます(「test」コマンドを使用)。終了コード0を返す場合は、ディレクトリが存在します。それ以外の場合は、存在しません。それに応じて行動することができます。
# Both the command and the name of your directory are "test"
# To avoid confusion, I just put the directory in a separate variable
YOURDIR="test"
# Check if the folder exists remotely
ssh [email protected] "test -d $YOURDIR"
if [ $? -ne 0 ]; then
# Directory does not exist
sftp [email protected] << EOF
mkdir test
put test.xml
bye
EOF
else
# Directory already exists
sftp [email protected] << EOF
put test.xml
bye
EOF
fi
man 1 sftp
(openssh-client
パッケージから):
-b batchfile
Batch mode reads a series of commands from an input
batchfile instead of stdin. Since it lacks user
interaction it should be used in conjunction with
non-interactive authentication. A batchfile of ‘-’
may be used to indicate standard input. sftp will
abort if any of the following commands fail: get,
put, reget, reput, rename, ln, rm, mkdir, chdir, ls,
lchdir, chmod, chown, chgrp, lpwd, df, symlink, and
lmkdir. Termination on error can be suppressed on a
command by command basis by prefixing the command
with a ‘-’ character (for example, -rm /tmp/blah*).
そう:
{
echo -mkdir dir1
echo -mkdir dir1/dir2
echo -mkdir dir1/dir2/dir3
} | sftp -b - $user@$Host