невозможно передать файл на ftp-сервер с помощью xp_cmdshell

Я использую этот код для передачи файла из моей локальной системы на ftp (у меня есть все права на чтение и запись для этого ftp).

        if exists (select * from sysobjects where id = object_id(N'[dbo].[s_ftp_PutFile]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
        drop procedure [dbo].[s_ftp_PutFile]
        GO

        Create procedure s_ftp_PutFile
        @FTPServer  varchar(128) ,
        @FTPUser    varchar(128) ,
        @FTPPWD     varchar(128) ,
        @FTPPath    varchar(128) ,
        @FTPFileName    varchar(128) ,

        @SourcePath varchar(128) ,
        @SourceFile varchar(128) ,

        @workdir    varchar(128)
        as
        /*
        exec s_ftp_PutFile  
                @FTPServer = '172.*****' ,
                @FTPUser = 'username' ,
                @FTPPWD = 'password' ,
                @FTPPath = '/dir1/' ,
                @FTPFileName = 'test2.txt' ,
                @SourcePath = 'c:\vss\mywebsite\' ,
                @SourceFile = 'test2.txt' ,

                @workdir = 'c:\temp\'
        */

        declare @cmd varchar(1000)
        declare @workfilename varchar(128)

            select @workfilename = 'ftpcmd.txt'

            -- deal with special characters for echo commands
            select @FTPServer = replace(replace(replace(@FTPServer, '|', '^|'),'<','^<'),'>','^>')
            select @FTPUser = replace(replace(replace(@FTPUser, '|', '^|'),'<','^<'),'>','^>')
            select @FTPPWD = replace(replace(replace(@FTPPWD, '|', '^|'),'<','^<'),'>','^>')
            select @FTPPath = replace(replace(replace(@FTPPath, '|', '^|'),'<','^<'),'>','^>')

            select  @cmd = 'echo '                  + 'open ' + @FTPServer
                    + ' > ' + @workdir + @workfilename
            exec master..xp_cmdshell @cmd
            select  @cmd = 'echo '                  + @FTPUser
                    + '>> ' + @workdir + @workfilename
            exec master..xp_cmdshell @cmd
            select  @cmd = 'echo '                  + @FTPPWD
                    + '>> ' + @workdir + @workfilename
            exec master..xp_cmdshell @cmd
            select  @cmd = 'echo '                  + 'put ' + @SourcePath + @SourceFile + ' ' + @FTPPath + @FTPFileName
                    + ' >> ' + @workdir + @workfilename
            exec master..xp_cmdshell @cmd
            select  @cmd = 'echo '                  + 'quit'
                    + ' >> ' + @workdir + @workfilename
            exec master..xp_cmdshell @cmd

            select @cmd = 'ftp -s:' + @workdir + @workfilename

            create table #a (id int identity(1,1), s varchar(1000))
            insert #a
            exec master..xp_cmdshell @cmd

            select id, ouputtmp = s from #a
        go

Я не могу передать файл и получаю эту ошибку

1 пользователь (172.******:(нет)): открыть 172.******

2 НОЛЬ

3 НУЛЕВОЕ

4 поместите c:\vss\mywebsite\test2.txt /dir1/test2.txt

5 c:\vss\mywebsite\test2.txt: файл не найден

6 бросить

7 НОЛЬ

однако я могу передать через приглашение cmd.


person money26    schedule 07.11.2014    source источник
comment
Сгенерируйте код из процедуры, поместите его в пакетный файл и затем выполните. Если код работает, а вы ничего не меняете, то у sql нет достаточных разрешений. Также используйте sftp вместо ftp, это более безопасно.   -  person SubqueryCrunch    schedule 07.11.2014
comment
эй, subquerycrunch, так что это означает, что приведенный выше код в порядке. Я все еще получаю ту же ошибку файла не найден. Есть ли другой способ сделать это без создания пакетного файла.   -  person money26    schedule 07.11.2014
comment
Вы знаете, что когда вы выполняете свой код, он выполняется на машине, на которой размещен сервер sql, например: на вашем компьютере у вас есть файл C:\asd.txt, и когда вы запускаете пакет, он работает. Вы запускаете код на сервере, поэтому он ищет файл на сервере, а там файла действительно не существует. Таким образом, вы должны скопировать расположение вашего файла с вашего сервера sql. Потому что sql не работает с вашими локальными путями.   -  person SubqueryCrunch    schedule 07.11.2014
comment
так что я должен сделать, чтобы передать много файлов на ftp-сервер, используя только процедуру sql. дайте мне знать, если у вас есть ссылка, чтобы разобраться во всем этом.   -  person money26    schedule 07.11.2014
comment
Вы размещаете свой сервер sql локально?   -  person SubqueryCrunch    schedule 07.11.2014
comment
да, я размещаю его локально   -  person money26    schedule 07.11.2014


Ответы (1)


может ли sql делать другие вещи как командная строка?

Кроме того, этот uid ss использует в командной строке, есть ли у него права на передачу данных с компьютера ss на место назначения? многие предприятия не позволяют «служебным» идентификаторам волей-неволей разговаривать по сети с кем угодно. для этого соединения могут потребоваться права.

person SQLburn    schedule 07.11.2014