web-dev-qa-db-ja.com

sftpにディレクトリが存在しない場合のディレクトリの作成方法

Sftpサーバーにログインした後にディレクトリが存在しない場合は、ディレクトリを作成したいと思います。

test.sh

sftp [email protected] << EOF
mkdir test
put test.xml
bye
EOF

今、私はtest.shを呼び出し、毎回異なるファイルをtestフォルダーにアップロードします。これを実行するとき

mkdir test

1回目は機能し、2回目はスローします。ディレクトリを作成できませんでした:失敗エラー?

存在しない場合にディレクトリを作成する方法、および存在する場合はsftpにディレクトリを作成しないでください。

7
Galet

このスレッドが古く、回答済みとマークされていることを理解していますが、私の場合は回答が機能しませんでした。 「ディレクトリの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接続が失敗した場合、またはアドレスが正しくない場合は、エラーによってアクションが実行されます。

6
DevOps ninja

別のバリエーションは、SFTPセッションを2つに分割することです。

最初のSFTPセッションは、単にMKDIRコマンドを発行します。

次に、2番目のSFTPセッションは、ディレクトリの存在を想定してファイルを配置できます。

3
andyb

アカウントの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
3
Oldskool

man 1 sftpopenssh-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
1
gavenkoa