Score:-1

เหตุใดสคริปต์ PSFTP จึงล้มเหลวเมื่อรันเป็นระบบ

ธง cn

ฉันมีไฟล์แบตช์ Windows cmd ที่ควรดึงรายชื่อไฟล์ที่อยู่บนเซิร์ฟเวอร์ FTP ผ่าน sFTP โดยใช้ PuTTY PSFTP exe และใช้สำหรับการประมวลผลเพิ่มเติม cmd คือ:

เสียงสะท้อน | psftp -l myusername -pw mycomplexpwd FTPServerHostname > C:/Users/myuser/Desktop/ls.txt

มันควรจะส่งออกรายการใน ls.txt ไฟล์ที่ฉันใช้ในสคริปต์อื่น เมื่อเรียกใช้ในฐานะผู้ใช้ทั่วไป ฉันได้รับรายชื่อไม่เป็นไร อย่างไรก็ตาม เมื่อใช้ Task Scheduler และกำหนดเวลาสคริปต์เป็น ระบบ ผู้ใช้ ฉันได้รับสิ่งนี้ในไฟล์เอาต์พุตเท่านั้น:

ไดเร็กทอรีการทำงานระยะไกลคือ /
psftp> เลิก

ฉันเดาว่ามีปัญหาในท่อ | การใช้งานหรือบางอย่าง ดังนั้นฉันจึงลองใช้ไวยากรณ์นี้ด้วย แต่ผลลัพธ์เดียวกันด้วย:

psftp -l myusername -pw mycomplexpwd FTPServerHostname < C:/Users/myuser/Desktop/lscmd.txt > C:/Users/myuser/Desktop/ls.txt

อะไรเป็นสาเหตุของปัญหาเมื่อตั้งเวลางานเป็นระบบแทนที่จะเป็นผู้ใช้ของฉัน แล้วจะรับรายชื่อเป็นระบบได้อย่างไร? โปรดทราบว่าเมื่อรันสคริปต์ในฐานะผู้ดูแลระบบ (คลิกขวา - เรียกใช้ในฐานะผู้ดูแลระบบ) ฉันได้รับรายชื่อไม่เป็นไร ปัญหาจะเกิดขึ้นเฉพาะเมื่อใช้ตัวกำหนดตารางเวลางานและกำหนดเวลางานเป็นระบบ

ระบบปฏิบัติการคือ Windows Server 2012 R2

cn flag
ฉันลงคะแนนให้ปิดคำถามนี้เพราะมีการโพสต์ข้ามไปยัง SO: https://stackoverflow.com/questions/70041315/how-to-script-sftp-commands-with-psftp
Score:0
ธง cn

หลังจากขุดค้นเล็กน้อย ปรากฎว่า PSFTP ไม่รู้จักคีย์ไปยังเซิร์ฟเวอร์ ftp ฉันเปิด cmd เป็น ระบบ (ซึ่งอาจเป็นเรื่องยุ่งยากสักหน่อย!) และเชื่อมต่อผ่าน PSFTP ยอมรับการไว้วางใจโฮสต์ (เซิร์ฟเวอร์ sFTP) และหลังจากนั้นสคริปต์ก็ทำงานตามที่คาดไว้! มันไม่ได้สร้างปัญหาให้กับผู้ใช้รายอื่นเนื่องจากมันถูกใช้ในการทดสอบและได้รับการแจ้งเตือนก่อนหน้านี้!

FYI คีย์ยังถูกจัดเก็บไว้ใน Registry ภายใต้ HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeysดังนั้นจึงสามารถเพิ่มสำหรับผู้ใช้รายอื่นหากคุณไม่ต้องการเข้าสู่ระบบด้วยตนเอง (ฉันเพิ่มการตรวจสอบในสคริปต์ของฉันเพื่อเพิ่มหากขาดหายไปสำหรับผู้ใช้ที่เรียกใช้สคริปต์)

แก้ไข: ฉันเชื่อว่าปัญหาที่ใหญ่ที่สุดของฉันคือการรับคำสั่งเป็น ระบบ ดังนั้นฉันจึงสามารถดีบักสิ่งที่เกิดขึ้นได้ เมื่อฉันทำได้ (ดูลิงก์ด้านบนสำหรับวิธีที่ฉันทำ) มันก็ชัดเจนสำหรับฉันเพื่อการอ้างอิงและความชัดเจนที่ดีขึ้น ด้านล่างนี้เป็นผลลัพธ์ของคำสั่งก่อนที่จะเพิ่มคีย์ เพียงปิดบังส่วนที่ละเอียดอ่อน:

C:\Users\myuser>echo ls | psftp -l myftpuser -pw mycomplexpswd sftp_server
คีย์โฮสต์ของเซิร์ฟเวอร์ไม่ถูกแคช คุณไม่มีการรับประกัน
ว่าเซิร์ฟเวอร์คือคอมพิวเตอร์ที่คุณคิด
ลายนิ้วมือคีย์ rsa2 ของเซิร์ฟเวอร์คือ:
ssh-rsa 2048 SHA256: thecomplexfancyhostkey
หากคุณเชื่อถือโฮสต์นี้ ให้ป้อน "y" เพื่อเพิ่มรหัส
แคชของ PuTTY และดำเนินการเชื่อมต่อต่อไป
หากคุณต้องการเชื่อมต่อเพียงครั้งเดียวโดยไม่ต้อง
เพิ่มรหัสในแคชป้อน "n"
หากคุณไม่เชื่อถือโฮสต์นี้ ให้กด Return เพื่อละทิ้ง
การเชื่อมต่อ.
จัดเก็บรหัสในแคช? (y/n, Return ยกเลิกการเชื่อมต่อ, i สำหรับข้อมูลเพิ่มเติม) 
ใช้ชื่อผู้ใช้ "myftpuser"
ข้อความแบนเนอร์การตรวจสอบสิทธิ์ล่วงหน้าจากเซิร์ฟเวอร์:
| เข้าสู่ระบบ FTP บริษัท - โปรดป้อนข้อมูลรับรองที่ถูกต้องเพื่อดำเนินการต่อ
สิ้นสุดข้อความแบนเนอร์จากเซิร์ฟเวอร์
ข้อความแจ้งการรับรองความถูกต้องด้วยแป้นพิมพ์โต้ตอบจากเซิร์ฟเวอร์:
สิ้นสุดการโต้ตอบด้วยคีย์บอร์ดจากเซิร์ฟเวอร์
ไดเร็กทอรีการทำงานระยะไกลคือ /
psftp> เลิก
so flag
แต่คุณไม่สามารถรับ *"ไดเรกทอรีการทำงานระยะไกลคือ /"* หากนี่เป็นปัญหา ดังนั้นคุณไม่ได้ให้ข้อมูลที่ถูกต้องแก่เรา
amyassin avatar
cn flag
@MartinPrikryl ฉันเข้าใจว่าทำไมคุณคิดอย่างนั้น แต่นั่นคือสิ่งที่ฉันได้รับ ฉันลองในเซิร์ฟเวอร์อื่นด้วยและได้ผลลัพธ์เดียวกัน! ไม่ได้คาดหวังเช่นกัน..ข้อผิดพลาดไม่ได้ถูกไพพ์ลงในไฟล์เฉพาะบรรทัดเหล่านั้น..
so flag
คุณจะไม่ได้รับ *"The server's host key is not cached"* ไปยัง `ls.txt` เนื่องจากคุณกำลังเปลี่ยนเส้นทาง stdout เท่านั้น ไม่ใช่ stderr ที่คาดไว้ â แต่คุณไม่สามารถรับ *"ไดเรกทอรีการทำงานระยะไกลคือ /"* ได้เช่นกัน เนื่องจากคุณจะรับได้หลังจากที่คุณเชื่อมต่อจริงเท่านั้น ซึ่งเป็นสิ่งที่คุณไม่ได้ทำ
amyassin avatar
cn flag
@MartinPrikryl ใช่ฉันเข้าใจและฉันเห็นด้วยกับคุณโดยสิ้นเชิง แต่นั่นคือสิ่งที่เกิดขึ้น มีอะไรผิดพลาดหรือแตกต่างไปจากที่คุณคิดหรือไม่? ฉันไม่ได้ให้ข้อมูลผิด ฉันแค่ได้อะไรมา..
so flag
ฉันไม่เข้าใจความคิดเห็นของคุณ + Btw ทางออกที่ดีกว่าสำหรับการยอมรับรหัสโฮสต์คือการใช้สวิตช์ `-hostkey`
amyassin avatar
cn flag
@MartinPrikryl ฉันลบคีย์ออกจาก Registry และลองใหม่จาก cmd อีกครั้ง และแก้ไขคำตอบของฉันเพื่อให้คุณเห็นผลลัพธ์ที่ฉันได้รับ ฉันเชื่อว่าส่วนใหญ่อยู่ใน stderr แต่มีเอาต์พุตของ 'ไดเรกทอรีการทำงานระยะไกลคือ /'
amyassin avatar
cn flag
นอกจากนี้ ขอบคุณสำหรับเคล็ดลับ `-hostkey` ซึ่งดีกว่าที่ฉันเชื่อ..
so flag
ตกลง ดังนั้นคุณจึง *เชื่อมต่อ* เพราะใช้ `ls` เพื่อยืนยันข้อความแจ้ง (เป็น 'n') และเนื่องจากไม่มีคำสั่งเพิ่มเติมในการป้อนข้อมูล จึงไม่ได้ทำอย่างอื่น ตกลงขอโทษแล้ว (ตรงกันข้ามกับ `-b` คุณจะไม่เชื่อมต่อ เนื่องจากไม่มีการตอบสนองต่อข้อความแจ้ง)
so flag
นั่นหมายความว่าด้วย `-b` คุณจะไม่ได้รับ *"ไดเรกทอรีการทำงานระยะไกลคือ /"* ถูกต้องหรือไม่ ตรงกันข้ามกับคำถามของคุณใน SO พูด

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา