SQL Server执行xp_cmdshell以从UNIX框中通过FTP协议导入文本文件

时间:2015-12-21 16:00:31

标签: sql-server sftp solaris bcp xp-cmdshell

过去我曾在SQL Server中使用xp_cmdshell来调用BCP实用程序,以便在两台Windows机器之间将文本文件导入SQL Server上的表中。这两台计算机位于同一个域,无需密码(因为SQL Server命令使用的是受信任/密码较少的连接)。这是通过设置源计算机的目录来完成的,以使文件继承目标计算机所属的组所有权。

我想知道,当使用相同的方法将文本文件从Solaris服务器导入到同一Windows服务器但是在不同的域上时,是否也可以这样做。

以下是我想要执行的存储过程:

DECLARE @CMD VARCHAR(6000), @SystemCode INT;
DECLARE @ResultsFromCommand TABLE(SystemMessage VARCHAR(500));

SELECT @Cmd ='bcp [Destination].dbo.AC_Test in "ftp://10.251.11.10/TestFile.txt" -c -F2 -r\n -t^| -Ssqldevelopment\sqldevelopment -T';

INSERT @ResultsFromCommand EXEC @SystemCode = MASTER.dbo.xp_cmdshell @Cmd;

SELECT * FROM @ResultsFromCommand;

由于无法建立连接,因此我收到了SQL Native Error 0.

我想知道如果因为上次机器在同一个域上,我只需要放置目录" \ ftpprod \ testserver \ file.txt"这次域名是不同的我必须使用" ftp:\ 10.251.11.10 \ TestFile.txt",这将使它变得不可能。

4 个答案:

答案 0 :(得分:0)

可以使用psftp自动执行ftp部分,然后在第二步调用bcp从本地目录导入。

答案 1 :(得分:0)

你最好去@Eduardo的回复。你将面临很多问题xp_cmdshell,

  1. 谁打算叫它?
  2. 它将运行什么安全上下文。
  3. 是否还有其他任何与MSDTC一起使用的交易。
  4. 你必须在dev / uat / production中镜像所有这些。

    希望这会有所帮助。

答案 2 :(得分:0)

我可能没有正确理解这个问题,但ftp是一个标准的网络协议,因此只要设置和权限设置正确,主机操作系统就不应该对ftp的功能产生任何影响。服务器本身。

即:如果它在Windows框上托管的ftp服务器上工作,如果ftp服务器托管在unix框上,假设所有设置都相同,那么它会做同样的事情。

答案 3 :(得分:0)

似乎您在询问是否可以以及如何在Solaris计算机上更改/设置权限。

此处提供的步骤可能会更改,具体取决于您的Solaris版本和您的环境所具有的特定设置。

这些步骤没有任何保证,您绝不应该“盲目”地遵循安全建议或步骤来设置您负责的系统的安全性,因为您在线找到答案(即使在堆栈溢出),确保在将其应用于生产系统之前理解并测试此处显示的每一行

在服务器端,根据您拥有的Solaris版本,您需要执行以下步骤。

此过程配置专为 sftp 传输创建的 sftponly 目录。用户无法在传输目录外看到任何文件或目录。

使用 root 角色执行以下所有步骤。

在Secure Shell服务器上,将隔离目录创建为chroot环境。

# groupadd sftp
# useradd -m -G sftp -s /bin/false sftponly
# chown root:root /export/home/sftponly
# mkdir /export/home/sftponly/WWW
# chown sftponly:staff /export/home/sftponly/WWW

在此配置中,/ export / home / sftonly是只有root帐户可以访问的chroot目录。用户具有sftponly / WWW子目录的写权限。

仍在服务器上,为sftp组配置匹配块。

在/ etc / ssh / sshd_config文件中,找到sftp子系统条目并按如下方式修改文件:

# pfedit /etc/ssh/sshd_config
...
# sftp subsystem
#Subsystem       sftp    /usr/lib/ssh/sftp-server
Subsystem       sftp    internal-sftp
...
## Match Group for Subsystem
## At end of file, to follow all global options
Match Group sftp
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no

您可以使用以下变量指定chroot路径:

%h - 指定主目录。

%u - 指定经过身份验证的用户的用户名。

%% - 转换%符号。

客户端上,验证配置是否正常运行。

chroot环境中的文件可能不同。

root@client:~# ssh sftponly@server
This service allows sftp connections only.
Connection to server closed. No shell access, sftp is enforced.
root@client:~# sftp sftponly@server
sftp> pwd sftp access granted
Remote working directory: /chroot directory looks like root directory
sftp> ls
WWW             local.cshrc     local.login     local.profile
sftp> get local.cshrc
Fetching /local.cshrc to local.cshrc
/local.cshrc    100%  166     0.2KB/s   00:00user can read contents
sftp> put /etc/motd
Uploading /etc/motd to /motd
Couldn't get handle: Permission denieduser cannot write to / directory
sftp> cd WWW
sftp> put /etc/motd
Uploading /etc/motd to /WWW/motd
/etc/motd     100%  118     0.1KB/s   00:00user can write to WWW directory
sftp> ls -l
-rw-r--r--    1 101  10    118 Jul 20 09:07 motdsuccessful transfer
sftp>

这取自本文件

https://docs.oracle.com/cd/E36784_01/html/E37125/sshuser-18.html